【问题标题】:Missing installed dependencies when docker image is used使用 docker 映像时缺少已安装的依赖项
【发布时间】:2020-02-19 07:22:11
【问题描述】:

这是我的 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

【问题讨论】:

  • 你的 github 中的运行没有覆盖 dockerfile 中的吗?
  • 它不能覆盖,第一个运行命令只检查它是否全局安装,另一个应该打印安装的插件列表,所以我可以继续前进。

标签: docker continuous-integration dockerfile continuous-deployment github-actions


【解决方案1】:

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

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"。这会将主机中的本地文件(包括您签出的存储库的副本)安装到容器中。然后将$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
  • 恐怕我对此一无所知。最好提出一个新问题,因为它不再是同一个问题了。
【解决方案2】:

我认为不是镜像的问题,在本地镜像上很容易确认,你会看到插件在 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 make 没有意义,我觉得应该是 runs-on:ashimsohail/bluebase-image

【讨论】:

  • run-on的选项只有有限的列表供参考官方文档help.github.com/en/github/…
  • 你确认我提到的要测试的插件了吗?
  • 虽然docker run -it --rm --entrypoint "/bin/sh" plugintest -c "bluebase plugins"的输出显示了插件列表
  • 是的,当我在本地运行图像时会打印列表
  • 所以这可以确认是你的 github yml 配置的问题,而不是 docker 镜像的问题。
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 2015-09-09
  • 2018-12-03
  • 2022-11-09
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
相关资源
最近更新 更多