Получить значение переменной среды в Dockerfile
Я создаю контейнер для приложения ruby. Конфигурация моего приложения содержится в переменных среды (загружается внутри приложения с помощью dotenv).
одной из этих переменных конфигурации является общедоступный ip-адрес приложения, который используется внутри для создания ссылок.
Мне нужно добавить запись раздача указываю этот IP на 127.0.0.1 внутри контейнера, поэтому он может принести ссылки на приложения, как если бы не было в контейнерах.
поэтому я пытаюсь установить ENV в моем Dockerfile, который будет передавать переменную среды в контейнер.
я попробовал несколько вещей.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
все передает строку "REQUEST_DOMAIN" вместо значения переменной среды, хотя.
Есть ли способ передать значения переменных среды с хост-компьютера в контейнер?
6 ответов:
вы должны использовать
ARGдиректива в вашем Dockerfile, который предназначен для этой цели.The
ARGинструкция определяет переменную, которую пользователи могут передать во время сборки построителю с помощью команды docker build с помощью--build-arg <varname>=<value>флаг.так что ваши Dockerfile будет иметь эту строку:
ARG request_domainили если вы предпочитаете по умолчанию:
ARG request_domain=127.0.0.1теперь вы можете ссылаться эта переменная внутри вашего Dockerfile:
ENV request_domain=$request_domainтогда вы будете строить свой контейнер так:
$ docker build --build-arg request_domain=mydomain Dockerfile
Примечание 1: ваш образ не будет построен, если вы ссылались наARGв вашем Dockerfile, но исключил его в--build-arg.примечание 2: если пользователь указывает аргумент сборки, который не был определен в файле Dockerfile, сборка выводит предупреждение:
[предупреждение] один или несколько build-args [фу] не были поглощены.
Так что вы можете сделать:
cat Dockerfile | envsubst | docker build -t my-target -тогда есть Dockerfile с чем-то вроде:
ENV MY_ENV_VAR $MY_ENV_VARЯ думаю, что может быть проблема с некоторыми специальными символами, но это работает в большинстве случаев, по крайней мере.
альтернативы с помощью
envsubstбез потери возможности использовать команды типаCOPYилиADD, и без использования промежуточных файлов будет использовать в bash Подмена Процесса:docker build -f <(envsubst < Dockerfile) -t my-target .Примечание: первоначально хотел добавить комментарий к ответ jonasfj но, кажется, у меня недостаточно репутации.
загрузите переменные среды из файла, созданного во время выполнения.
export MYVAR="my_var_outside" cat > build/env.sh <<EOF MYVAR=${MYVAR} EOF... затем в Dockerfile
ADD build /build RUN /build/test.shгде test.sh загружает MYVAR из env.sh
#!/bin/bash . /build/env.sh echo $MYVAR > /tmp/testfile
Если вы просто хотите найти и заменить все переменные среды ($ExampleEnvVar) в Dockerfile, то построить его это будет работать:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
добавить
-eключ для передачи переменных среды в контейнер. пример:$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID) $ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash root@87f235949a13:/# echo $DBIP 172.17.0.2
Comments