Pobranie wartości zmiennej środowiskowej w pliku Dockerfile

Buduję kontener dla aplikacji ruby. Konfiguracja mojej aplikacji jest zawarta w zmiennych środowiskowych (ładowanych wewnątrz aplikacji za pomocą dotenv ).

Jedną z tych zmiennych konfiguracyjnych jest publiczny adres ip aplikacji, który jest używany wewnętrznie do tworzenia linków. Muszę dodać wpis dnsmasq wskazujący ten adres ip do 127.0.0.1 wewnątrz kontenera, aby mógł pobrać linki aplikacji tak, jakby nie były containerized.

Dlatego staram się ustawić ENV w moim Dockerfile, który przekazuje zmienną środowiskową do kontenera.

Próbowałem kilku rzeczy.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

Wszystko przekazuje łańcuch "REQUEST_DOMAIN"zamiast wartości zmiennej środowiskowej. Czy istnieje sposób przekazywania wartości zmiennych środowiskowych z komputera hosta do kontenera?

 169
Author: Damien MATHIEU, 2013-10-23

6 answers

Powinieneś użyć ARG dyrektywa w pliku Dockerfile, który jest przeznaczony do tego celu.

Instrukcja ARG definiuje zmienną, którą użytkownicy mogą przekazać konstruktorowi w czasie kompilacji za pomocą polecenia docker build używając znacznika --build-arg <varname>=<value>.

Więc twój Dockerfile będzie miał tę linię:

ARG request_domain

Lub jeśli wolisz wartość domyślną:

ARG request_domain=127.0.0.1

Teraz możesz odwołać się do tej zmiennej w swoim pliku Dockerfile:

ENV request_domain=$request_domain

Then zbudujesz swój kontener w ten sposób:

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


Uwaga 1: Twój obraz nie zostanie zbudowany, jeśli odwołałeś się do ARG w pliku Dokerowym, ale wyłączyłeś go w --build-arg.

Uwaga 2: Jeśli użytkownik określa argument build, który nie został zdefiniowany w pliku Dockerfile, build wyświetla ostrzeżenie:

[Warning] jeden lub więcej build-args [foo] nie zostało skonsumowanych.

 260
Author: Daniel van Flymen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 17:35:05

Więc możesz zrobić: cat Dockerfile | envsubst | docker build -t my-target -

Następnie miej plik Dockerfile z czymś takim:

ENV MY_ENV_VAR $MY_ENV_VAR

Myślę, że może być problem z niektórymi znakami specjalnymi, ale to działa przynajmniej w większości przypadków.

 49
Author: jonasfj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-27 18:13:44

Alternatywą używającą envsubst bez utraty możliwości używania poleceń takich jak COPY lub ADD i bez używania plików pośrednich byłoby użycie podstawienia procesu Basha :

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

Uwaga: pierwotnie chciałem dodać komentarz do jonasfj ' s answer ale wygląda na to, że nie mam wystarczającej reputacji.

 11
Author: L. Alberto Giménez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:24

Załaduj zmienne środowiskowe z pliku, który tworzysz w czasie wykonywania.

export MYVAR="my_var_outside"
cat > build/env.sh <<EOF
MYVAR=${MYVAR}
EOF

... następnie w pliku Dockerfile

ADD build /build
RUN /build/test.sh

Gdzie test.sh ładuje MYVAR z env.sh

#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile
 9
Author: Dan C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 22:57:57

Jeśli chcesz znaleźć i zastąpić wszystkie zmienne środowiskowe ($ExampleEnvVar) w pliku Dockerfile, zbuduj go tak:

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

 2
Author: snassr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 19:30:54

Dodaj -e Klucz do przekazywania zmiennych środowiskowych do kontenera. przykład:

$ 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
 -5
Author: Valentin Kantor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-26 20:45:07