Доступ к смонтированным томам из Docker для установки composer / npm во время сборки? - PullRequest
0 голосов
/ 01 января 2019

Я ищу лучшее решение для установки пакетов composer или npm внутри томов хоста, смонтированных через docker-compose.

В моем docker-compose.yml у меня есть:

volumes:
  - ./app:/var/www/app
  ...

И в моем dockerfile я хотел бы использовать этот том для установки вещей:

VOLUME ["/var/www/app"]
RUN composer install -d /var/www/app

Но, насколько я понимаю, тома, смонтированные в docker-compose, еще не доступны, когда контейнер работаетпостроен из файла Docker.

Итак, моя следующая попытка была сделать это при запуске контейнера:

CMD bash -c "composer install -d /var/www/app && /usr/sbin/apache2ctl -DFOREGROUND"

Это работало по крайней мере, но вызывало установку composer при каждом запуске контейнера, чтоявляется избыточным.

Итак, моя текущая идея - использовать для установки специальный образ композитора, монтировать в него файл composer.json, а затем скопировать готового поставщика из контейнера компоновщика в контейнер и связать его там, где это необходимо.Вот так:

FROM composer as composer
COPY ./app/composer.json /app
COPY ./app/composer.lock /app
RUN composer install --ignore-platform-reqs --no-scripts

FROM library/ubuntu:jessie
# ... do other stuff with the main image ...

COPY --from=composer /app/vendor /var/www/composer/vendor
CMD bash -c "ln -s /var/www/composer/vendor /var/www/app/vendor  && /usr/sbin/apache2ctl -DFOREGROUND"

Но это все еще похоже на обходной путь для такой обычной проблемы.Есть ли лучший способ сделать это или какой-либо известный пример хорошей практики?

1 Ответ

0 голосов
/ 01 января 2019

То, что я считаю лучшей практикой, и то, что я делаю профессионально, - это вообще не использовать объемы для этого случая.Мой Dockerfile COPY s в коде приложения во время сборки.У меня есть рабочая настройка разработки хоста (единственная реальная зависимость от хоста - это сам узел; все остальное находится в каталоге node_modules), и поэтому, если у меня есть проблема, я могу воспроизвести, отладить и написать тест для нее в моей локальной среде.,Только когда это сработает, я вернусь в Docker.

FROM ???
WORKDIR /var/www/app
COPY app/composer.json app/composer.lock ./
RUN composer install --ignore-platform-reqs --no-scripts
COPY app/ ./
...
CMD ["apache2ctl", "-DFOREGROUND"]

В противном случае, есть несколько моментов, связанных с томами Docker, которые следует запомнить здесь:

  • Все в Dockerfileпроисходит до того, как будут рассмотрены какие-либо тома или переменные среды в файле docker-compose.yml.Если ваша цель состоит в том, чтобы заполнить том, вы не можете сделать это в Dockerfile (и это вообще неудобно в Docker; вместо этого используйте собственные инструменты хоста).

  • Если высмонтируйте том в каталог контейнера, он полностью скрывает то, что уже есть.Я вижу много вопросов с Dockerfiles, которые работают только внутри контейнерной локальной директории /app, а затем привязывают к ней локальное дерево исходных текстов;это в основном делает Dockerfile недоступным.

  • Если в вашем Dockerfile есть директива VOLUME, вы больше не сможете вносить какие-либо изменения в этот каталог в образе.(В вашем вопросе выполнение composer после директивы VOLUME не будет иметь эффекта молча.)

  • Вы можете смонтировать том в любой каталог в контейнере независимо от того, включен он или нет.это было объявлено как VOLUME.Я бы рекомендовал никогда не объявлять VOLUME s в Dockerfiles, и особенно не для каталогов, содержащих код (вы хотите , чтобы они обновлялись новым кодом изображения, когда контейнер удаляется и воссоздается).

...