Использовать переменную 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 и т.д.