Я создаю контейнер для приложения ruby. Конфигурация моего приложения содержится в переменных окружения (загружается в приложение с помощью dotenv ).
Одной из этих переменных конфигурации является общедоступный IP-адрес приложения, который используется внутри системы для создания ссылок. Мне нужно добавить запись dnsmasq, указывающую этот ip на 127.0.0.1 внутри контейнера, чтобы он мог получать ссылки приложения, как если бы он не был в контейнере.
Поэтому я пытаюсь установить ENV
в моем Dockerfile, который будет передавать переменную среды в контейнер.
Я попробовал несколько вещей.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
Все передает строку «REQUEST_DOMAIN» вместо значения переменной окружения. Есть ли способ передать значения переменных среды с хост-машины в контейнер?
Your image will not build if you have referenced an ARG in your Dockerfile but excluded it in --build-arg
ты неправ. Вы можете создать изображение со ссылками даже без --build-arg. Кроме того, вы можете установить значение по умолчанию для сборки аргумента.Так что вы можете сделать:
cat Dockerfile | envsubst | docker build -t my-target -
Затем создайте Dockerfile с чем-то вроде:
Я предполагаю, что могут быть проблемы с некоторыми специальными символами, но это работает, по крайней мере, в большинстве случаев.
источник
envsubst
как частьbrew install gettext
. Но из-за возможных конфликтов с системой сборки BSD она «только для бочонка» и никаких сообщений не производится. Тем не менее, это безопасно сделать,ln -s /usr/local/Cellar/gettext/*/bin/envsubst /usr/local/bin/
чтобы добавить эту одну команду в ваш путь. (Это действительно либсы, которые вызывают беспокойство.) Или вы можете использовать его в своем/usr/local/Cellar/gettext/*/bin/envsubst
местеdocker build -
, в частности, не работает, когда вы ссылаетесь на относительные пути из вашего Dockerfile, независимо от подстановки env var.docker build
вместо этого. Пример:cat Dockerfile | envsubst > DockerfileWithEnvVars
тогдаdocker build -t my-target -f DockerfileWithEnvVars .
, тогдаrm DockerfileWithEnvVars
envsubst < Dockerfile | sponge Dockerfile
Альтернативное использование
envsubst
без потери возможности использовать такие команды, какCOPY
илиADD
, и без использования промежуточных файлов будет состоять в использовании Bash's Process Substitution :источник
unable to prepare context: the Dockerfile (/dev/fd/63) must be within the build context
Загрузка переменных среды из файла, который вы создаете во время выполнения.
... тогда в Dockerfile
где test.sh загружает MYVAR из env.sh
источник
Если вы просто хотите найти и заменить все переменные окружения ($ ExampleEnvVar) в Dockerfile, то скомпилируйте его так:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
источник
envsubst < ./Dockerfile | docker build -squash -t ${DOCKIMG}:${VERSION} . -f -
гдеFROM
строка использует переменную окружения.добавить
-e
ключ для передачи переменных среды в контейнер. пример:источник