Переменные среды Docker в многоэтапных сборках

учитывая этот .env файл:

TEST=33333

учитывая этот docker-compose.yml файл:

  service_name:
    image: test
    env_file: .env
    environment:
      TEST: 22222

учитывая этот Dockerfile файл:

FROM an_image AS builder

FROM another_image
ENV TEST 11111

CMD ["/bin/echo $TEST"]

Каждый раз, когда я создаю и запускаю этот образ в контейнере, он печатает 11111.

Если я удалю строку ENV 11111 из файла Docker, моя переменная среды TEST станет пустой ...

Получает ли родительский образ переменные среды, но не дочерний?

Спасибо!

РЕДАКТИРОВАТЬ:

  1. попытка ENV TEST ${TEST} не сработала ($ TEST пуст)
  2. удаление ENV TEST не сработало ($ TEST пуст)

person Mike Gleason jr Couturier    schedule 07.11.2017    source источник


Ответы (2)


Так что это не многоступенчатый вопрос.

Похоже, что ENV переменные используются только при запуске контейнеров (docker-compose up). Не во время сборки (docker-compose build). Итак, вы должны использовать arguments:

.env:

TEST=11111

docker-compose.yaml:

version: '3'
services:
  test:
    build:
      context: .
      args:
        TEST: ${TEST}

Dockerfile:

FROM nginx:alpine
ARG TEST
ENV TEST ${TEST}
CMD ["sh", "-c", "echo $TEST"]

тестовая команда:

docker rmi test_test:latest ; docker-compose build && docker run -it --rm test_test:latest

Серьезно, документации немного не хватает.

Ссылка: https://github.com/docker/compose/issues/1837

person Mike Gleason jr Couturier    schedule 08.11.2017
comment
Я не могу воспроизвести вашу проблему, вы действительно оцениваете переменную в CMD? CMD - это время выполнения, а не время сборки. - person BMitch; 08.11.2017
comment
Можно ли передать мой файл .env в аргументы? - person Rebar; 23.04.2021

Проблема не в многоступенчатости конкретно.

Речь идет о различиях между Dockerfile ARG и docker-compose YAML build args (аргументы сборки); и Dockerfile ENV & docker-compose YAML _5 _ / _ 6_.

Документы были обновлены (позже, чем исходный пост), и теперь это довольно ясно :

args

Добавьте аргументы сборки, которые являются переменными среды, доступными только во время процесса сборки.

Пример из документов для создания докеров

Начнем с простого, просто покажу взаимодействие между Dockerfile и YAML:

ARG buildno
ARG gitcommithash

RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
build:
  context: .
  args:
    buildno: 1
    gitcommithash: cdc3b19

build:
  context: .
  args:
    - buildno=1
    - gitcommithash=cdc3b19

Пример, чтобы связать это с вопросом:

См. другой ответ в этой теме.


Документы и углубление вашего понимания

Изучите один уровень абстракции за раз

Я рекомендую перейти от уровня абстракции Dockerfile вверх. Убедитесь, что вы понимаете каждый уровень, прежде чем добавлять следующий уровень абстракции.

  1. Dockerfile (а затем поиграйте с запущенными контейнерами из вашего Dockerfile ... используя по умолчанию ENV, затем поиграйте с --env, затем поиграйте с ARG и --build-arg)

  2. Затем добавьте детали docker-compose и поиграйте с ними.

  3. Затем вернитесь к Dockerfiles и изучите многоэтапные сборки.

Dockerfile

Полезный пост в блоге - фокусируется на Dockerfile, но во всех случаях лучше разбираться только в Dockerfiles, прежде чем добавлять к нему дополнительные уровни абстракции, такие как Docker-compose YAML.

https://vsupalov.com/docker-arg-env-variable-guide/ < / а>

из сообщения vsupalov.com на эту тему, https://vsupalov.com/docker-arg-env-variable-guide/

докер-сочинять

Затем составьте официальные документы docker-compose:

многоступенчатые файлы Dockerfiles

person driftcatcher    schedule 15.03.2019