Отсутствие установленных зависимостей при использовании образа докера - PullRequest
1 голос
/ 23 октября 2019

Вот мой 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 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

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Это была сложная проблема! Вот решение, которое сработало для меня. Я постараюсь объяснить, почему ниже.

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.

Решения

Решением, которое я пытался, было установить плагины на /github/home вместо/root в образе Docker.

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 зависят от HOME=/github/home для правильной работы. Таким образом, решение состоит в том, чтобы установить его временно для каждой команды.

HOME=/root bluebase web:build --help

Еда на вынос

Основной вывод из этого заключается в том, что любой инструмент, предварительно встроенный в контейнер, которыйполагается на $HOME, указывающая на определенное местоположение, может работать неправильно при использовании в синтаксисе jobs.<container_id>.container.

1 голос
/ 23 октября 2019

Я не думаю, что проблема с изображением, это легко проверить на локальном изображении, и вы увидите, что плагин доступен в образе 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.

...