Как установить переменные среды в Dockerfile и запустить родительский образ

#docker

#docker

Вопрос:

У меня есть dockerfile, который имеет entrypoint.sh файл, который экспортирует некоторую переменную Postgres. Затем я хочу запустить родительский контейнер docker, на который есть ссылка в изображении «ИЗ pactfoundation / pact-broker». Глядя на github для его Dockerfile github pact broker, у него есть CMD [«config.ru «] в конце. Итак, я сделал то же самое, что и в моем Dockerfile:

 FROM pactfoundation/pact-broker
  
COPY entrypoint.sh .

CMD ["config.ru"]
  

Когда я выполняю свою команду docker run:

 docker run --rm -e POSTGRES_PORT=5433 -e POSTGRES_DBNAME=pactsd -e POSTGRES_URL=localhost -e POSTGRES_PASSWORD=1234 -e POSTGRES_USERNAME=postgres --name pact sonamsamdupkhangsar/pact:test -d
  

Я вижу свой entrypoint.sh оператор echo, и контейнер мертв.

 setting pact broker database variables
  

Как мне запустить родительский контейнер после установки переменных среды в моем entrypoint.sh файл?

Я также пробовал со следующим:

 FROM pactfoundation/pact-broker
  
ENV PACT_BROKER_DATABASE_NAME=${POSTGRES_DBNAME}
ENV PACT_BROKER_DATABASE_USERNAME=${POSTGRES_USERNAME}
ENV PACT_BROKER_DATABASE_PASSWORD=${POSTGRES_PASSWORD}
ENV PACT_BROKER_DATABASE_HOST=${POSTGRES_URL}
ENV PACT_BROKER_DATABASE_NAME=${POSTGRES_DBNAME}
ENV PACT_BROKER_DATABASE_PORT=$POSTGRES_PORT

RUN echo "PACT_BROKER_DATABASE_PORT: $PACT_BROKER_DATABASE_PORT"
  

Тем не менее, когда я запускаю свой встроенный образ docker, я все еще не вижу, что переменные устанавливаются. Я попробовал оба подхода для «$ {}» и «$» для настройки env var.

Комментарии:

1. Все, что стоит после имени образа, интерпретируется как команда для запуска; -d опция в вашей docker run команде заменяет Dockerfile CMD . Если вы подразумеваете, что это docker run опция («отсоединенная»), она должна быть перед именем образа.

Ответ №1:

Вы должны установить переменные среды, используя ENV в вашем файле docker.

Поскольку каждый шаг выполняется в разных контейнерах, которые в целом создают образ, если вы устанавливаете с помощью сценариев оболочки, он не будет работать. Рассмотрите возможность использования команды ENV для его установки

Ссылка: DOCKERFILE ENV

Комментарии:

1. Я установил переменные среды, но родительский контейнер не использует заданные переменные.

Ответ №2:

Происходит то, что те переменные среды, которые вы передаете во время выполнения с параметром ‘-e’, еще не определены во время сборки, поскольку инструкции ENV выполняются только во время сборки.

Например, во время сборки этой строки у вас есть:

 ENV PACT_BROKER_DATABASE_NAME=${POSTGRES_DBNAME}
  

становится этой строкой:

 ENV PACT_BROKER_DATABASE_NAME=
  

поскольку ‘${POSTGRES_DBNAME}’ оценивается как пустой во время сборки. Затем, когда происходит время выполнения, вы определяете все свои переменные среды POSTGRES_ в качестве параметров, чтобы они действительно существовали в контейнере, НО никаких дальнейших инструкций для установки переменных среды PACT_BROKER_ в какие-либо другие значения выполняться не будет.

Предлагаемое решение: я бы рекомендовал самый простой подход, если вы можете заставить его работать, просто используя переменные среды «напрямую», однако вы определяете их как параметры. Т.е. Либо измените имена ваших параметров «-e» на PACT_BROKER_, либо используйте переменные среды POSTGRES_ в вашем контейнере. В любом случае вы должны удалить строки ENV из Dockerfile.

Если вам действительно-действительно нужно присвоить переменным среды другие имена во время выполнения, то вы должны быть в состоянии сделать это, записав в соответствующий файл ‘startup’ в Dockerfile (убедившись, что буквально записал ‘ $’s в файл, чтобы их можно было разыменовать при запуске-время).