Использовать переменную env для docker-compose в файле Dockerbuild
Имея следующий файл для сборки докеров:
db:
build: .
environment:
- MYSQL_ROOT_PASSWORD=password
- ENV=test
env_file: .env
Можно ли использовать переменные env, объявленные в docker-compose.yml(либо в качестве среды, либо объявленные в env_file) как часть файла Docker, не объявляя их в файле Docker? Что-то вроде этого:
FROM java:7
ADD ${ENV}/data.xml /data/
CMD ["run.sh"]
Ответы
Ответ 1
Хотя этот вопрос был задан давно, есть ответ на аналогичный вопрос: Передать переменные окружения из docker-compose в контейнер на этапе сборки
В принципе, чтобы использовать переменные во время сборки контейнера, нужно определить переменную в docker-compose.yml
:
build:
context: .
args:
MYSQL_ROOT_PASSWORD: password
ENV: test
а затем ссылайтесь на него в Dockerfile
, используя ARG
:
ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/
Что касается переменных среды, определенных в файле *.env
, я считаю, что они не могут быть переданы контейнеру во время сборки.
Ответ 2
Этот подход идет вразрез с теорией "строить один раз, запускать в любом месте" за Docker и большинством подходов DevOps. При таком подходе вам нужно будет создать контейнер для каждой среды, которую вы ожидаете использовать. Поступая таким образом, вы не можете спокойно сказать, работает ли контейнер в среде Dev, он будет работать в стадии постановки и производства, так как вы не используете один и тот же контейнер.
Вам было бы лучше добавить все необходимые файлы конфигурации в контейнер и написать entrypoint script, который выбирает/копирует данные для этой среды в правильное место при запуске контейнера. Вы также можете применить этот подход к другой конфигурации на контейнере, например, шаблонную конфигурацию Apache с использованием шаблонов jinja2 и т.д.