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



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



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



поэтому я пытаюсь установить ENV в моем Dockerfile, который будет передавать переменную среды в контейнер.



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



ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`


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

602   6  

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

    Ничего не найдено.