使用Docker镜像时缺少已安装的依赖项

3

这是我的 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 Actions中使用时,bluebase是全局可用的,但没有安装任何插件。我做错了什么?
Github Workflow
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


你的 GitHub 上的代码是否覆盖了 Dockerfile 中的代码? - LinPy
它不能覆盖,第一次运行命令只检查是否全局安装,其他命令应该打印已安装的插件列表,这样我才能进一步进行流程。 - Hashim
2个回答

5

这是一个棘手的问题!以下是适用于我的解决方案。我将尝试在下面解释为什么会有效。

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/root。 命令 bluebase plugins:add$HOME/.cache/@bluebase 安装插件依赖项,因此它们最终在 /root/.cache/@bluebase 中。

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

问题

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

解决方案

我尝试的解决方案是在 Docker 镜像中将插件安装到 /github/home 而不是 /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目录。所以我尝试了一些技巧,比如符号链接或将.cache/@bluebase目录移动到其他位置,以避免被挂载覆盖。但是这些方法都没有奏效。
因此,唯一的解决办法似乎是将$ HOME 更改回/root。这不应该永久在工作流程中进行,因为GitHub Actions依赖于HOME=/ github/home 才能正常工作。因此,解决办法是为每个命令临时设置它。
HOME=/root bluebase web:build --help

要点

本文的主要要点是:任何预先构建在容器中并依赖于$HOME指向特定位置的工具可能无法在jobs.<container_id>.container语法中正确使用。


你能帮我增加这个 Docker 镜像的观察者吗? 我遇到了这个错误 sysctl: setting key "fs.inotify.max_user_watches": Read-only file system - Hashim
我很抱歉,我对这方面一无所知。最好还是提出一个新问题,因为它已经不是同一个问题了。 - peterevans

1
我认为图片没有问题,在本地图片上进行确认很容易,您会看到插件在Docker镜像中可用。只需尝试运行即可。
docker build -t plugintest .
#then run the image on local system to verify plugin
docker run -it --rm --entrypoint "/bin/sh" plugintest -c "bluebase plugins"

似乎是您的YML配置文件有问题。
      image: hashimsohail/bluebase-image
    name: Deploy Web
    runs-on: ubuntu-latest

这行代码 runs-on: ubuntu-latest 没有意义,我认为应该是 runs-on:ashimsohail/bluebase-image

1
仅有有限的选项可供运行。请参考官方文档:https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idruns-on - Hashim
1
你确认按照我提到的测试插件了吗? - Adiii
所以,这证实了你的 Github yml 配置存在问题,而不是 Docker 镜像存在问题。 - Adiii
什么是解决方法?我已经厌倦了在每个GitHub工作流中不断安装所有的CLIs/插件。 - Hashim
我没有使用GitHub Actions,但你可以查看这个链接:https://dev59.com/flMH5IYBdhLWcg3w7Vrx - Adiii
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接