#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
команде заменяет DockerfileCMD
. Если вы подразумеваете, что это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 в файл, чтобы их можно было разыменовать при запуске-время).