Получить значение переменной среды в файле Dockerfile

Я создаю контейнер для рубинового приложения. Конфигурация моего приложения содержится в переменных среды (загружается внутри приложения с dotenv).

Одна из этих переменных конфигурации - это общедоступный ip приложения, который используется внутри для создания ссылок. Мне нужно добавить запись dnsmasq, указав этот ip на 127.0.0.1 внутри контейнера, чтобы он мог извлекать ссылки на приложение, как если бы он не был контейнерным.

Поэтому я пытаюсь установить ENV в свой файл Docker, который передаст в контейнер переменную среды.

Я пробовал несколько вещей.

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

Все передает строку "REQUEST_DOMAIN" вместо значения переменной среды. Есть ли способ передать значения переменных среды из главной машины в контейнер?

Ответ 1

Вы должны использовать директиву ARG в вашем файле Docker, который предназначен для этой цели.

Команда ARG определяет переменную, которую пользователи могут передавать при построении времени строителю с помощью команды сборки докеров, используя флаг --build-arg <varname>=<value>.

Таким образом, ваш Dockerfile будет иметь следующую строку:

ARG request_domain

или если вы предпочитаете значение по умолчанию:

ARG request_domain=127.0.0.1

Теперь вы можете ссылаться на эту переменную внутри вашего файла Docker:

ENV request_domain=$request_domain

то вы создадите свой контейнер следующим образом:

$ docker build --build-arg request_domain=mydomain Dockerfile


Примечание. Ваше изображение не будет создано, если вы указали ARG в своем файле Docker, но исключили его в --build-arg.

Ответ 2

Итак, вы можете сделать: cat Dockerfile | envsubst | docker build -t my-target -

Затем у вас есть файл Docker с чем-то вроде:

ENV MY_ENV_VAR $MY_ENV_VAR

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

Ответ 3

Загрузить переменные среды среды из файла, созданного во время выполнения.

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

Ответ 4

Альтернатива, использующая envsubst, не теряя возможности использовать команды типа COPY или ADD, и без использования промежуточных файлов будет использовать Bash Замена процесса:

docker build -f <(envsubst < Dockerfile) -t my-target .

ПРИМЕЧАНИЕ: Изначально хотелось добавить комментарий к jonasfj answer, но, похоже, у меня недостаточно репутации.

Ответ 5

Если вы просто хотите найти и заменить все переменные среды ($ ExampleEnvVar) в файле Docker, тогда создайте его, это будет работать:

envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -

Ответ 6

добавить -e ключ для передачи переменных среды в контейнер. Пример:

$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID)
$ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash

[email protected]:/# echo $DBIP
172.17.0.2