这是我的 Dockerfile

FROM node:10

RUN apt-get -qq update && apt-get -qq -y install bzip2

RUN yarn global add @bluebase/cli && bluebase plugins:add @bluebase/cli-expo && bluebase plugins:add @bluebase/cli-web
RUN bluebase plugins


构建 docker 文件后,它会安装所有依赖项,最后一个命令 RUN bluebase plugins 输出已安装的插件列表。但是当这个镜像被推送并在 github 操作中使用时,bluebase 是全局可用的,但没有安装插件。我究竟做错了什么?

Github 工作流程
name: Development CI

on:
  push:
    # Sequence of patterns matched against refs/heads
    branches:
      - '*' # Push events on all branchs
      - '*/*'
      - '!master' # Exclude master
      - '!next' # Exclude next
      - '!alpha' # Exclude alpha
      - '!beta' # Exclude beta

jobs:
web-deploy:
    container:
      image: hashimsohail/bluebase-image
    name: Deploy Web
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

      - name: Check BlueBase
        run: bluebase #Outputs list of comamnds available with bluebase

      - name: Check BlueBase Plugins
        run: bluebase plugins #Outputs no plugins installed

最佳答案

这是一个棘手的问题!这是对我有用的解决方案。我将在下面尝试解释原因。

jobs:
  web-deploy:
    container:
      image: hashimsohail/bluebase-image
    name: Deploy Web
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Check BlueBase
        run: bluebase
      - name: Check BlueBase Plugins
        run: HOME=/root bluebase plugins
      - name: Check web plugin
        run: HOME=/root bluebase web:build --help

背景

首先是Docker镜像。命令 bluebase plugins:add 似乎非常依赖于 $HOME 环境变量。您的 Docker 镜像是作为 root 用户构建的,因此 $HOME/rootbluebase plugins:add 命令在 $HOME/.cache/@bluebase 安装插件依赖项,因此它们最终位于 /root/.cache/@bluebase

现在是 jobs.<id>.container 功能。当您的容器运行时,会发生一些相当复杂的 Docker 网络和卷挂载。其中之一是 -v "/home/runner/work/_temp/_github_home":"/github/home" 。这会将主机中的本地文件(包括已 check out 存储库的副本)装入容器。然后它将 $HOME 更改为指向 /github/home

问题
bluebase plugins 不起作用的原因是因为它依赖于指向 $HOME/root 但现在 GitHub Actions 已将其更改为 /github/home

解决方案

我尝试的一个解决方案是将插件安装在 /github/home 而不是 Docker 镜像中的 /root
FROM node:10

RUN apt-get -qq update && apt-get -qq -y install bzip2

RUN mkdir -p /github/home
ENV HOME /github/home

RUN yarn global add @bluebase/cli && bluebase plugins:add @bluebase/cli-expo && bluebase plugins:add @bluebase/cli-web
RUN bluebase plugins

这样做的问题是 GitHub Actions 创建的卷挂载会覆盖 /github/home 目录。然后我尝试了一些技巧,比如符号链接(symbolic link)或移动 .cache/@bluebase 目录以避免它被挂载破坏。这些都没有用。

所以唯一的解决方案似乎是将 $HOME 改回 /root 。这不应在工作流程中永久完成,因为 GitHub 操作依赖于 HOME=/github/home 才能正常工作。所以解决方法是为每个命令临时设置它。
HOME=/root bluebase web:build --help

外卖

主要结论是,任何在容器中预先构建的、依赖于指向特定位置的 $HOME 的工具在 jobs.<container_id>.container 语法中使用时可能无法正常工作。

关于docker - 使用 docker 镜像时缺少已安装的依赖项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58516181/

10-16 05:25