Récupère la valeur de la variable d'environnement dans Dockerfile

Je construis un conteneur pour une application ruby. La configuration de mon application est contenue dans des variables d'environnement (chargées dans l'application avec dotenv).

L'une de ces variables de configuration est l'adresse ip publique de l'application, qui est utilisée en interne pour créer des liens. J'ai besoin d'ajouter une entrée dnsmasq pointant cette adresse ip vers 127.0.0.1 à l'intérieur du conteneur, afin qu'elle puisse récupérer les liens de l'application comme si elle n'était pas conteneurisée.

J'essaie donc de définir un ENV dans mon Dockerfile qui transmettrait une variable d'environnement au conteneur.

J'ai essayé quelques choses.

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

Tout passe la chaîne" REQUEST_DOMAIN " au lieu de la valeur de la variable d'environnement. Existe-t-il un moyen de transmettre les valeurs des variables d'environnement de la machine hôte au conteneur?

169
demandé sur Damien MATHIEU 2013-10-23 13:16:03

6 réponses

Vous devriez utiliser le ARG directive dans votre Dockerfile qui est destiné à cet effet.

L'instruction ARG définit une variable que les utilisateurs peuvent transmettre au moment de la construction au constructeur avec la commande docker build en utilisant l'indicateur --build-arg <varname>=<value>.

De Sorte que votre Dockerfile aura cette ligne:

ARG request_domain

, Ou si vous préférez une valeur par défaut:

ARG request_domain=127.0.0.1

Maintenant, vous pouvez référencer cette variable dans votre Dockerfile:

ENV request_domain=$request_domain

Alors vous allez construire votre conteneur comme ceci:

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


Note 1: Votre image ne sera pas construire si vous avez fait référence à un ARG dans votre Dockerfile mais exclus dans --build-arg.

Note 2: Si l'utilisateur spécifie construire un argument qui n'a pas été défini dans le Dockerfile, la construction émet un avertissement:

[avertissement] un ou plusieurs build-args [foo] n'ont pas été consommés.

260
répondu Daniel van Flymen 2018-02-15 17:35:05

Donc vous pouvez faire: cat Dockerfile | envsubst | docker build -t my-target -

Puis avoir un Dockerfile avec quelque chose comme:

ENV MY_ENV_VAR $MY_ENV_VAR

Je suppose qu'il pourrait y avoir un problème avec certains caractères spéciaux, mais cela fonctionne dans la plupart des cas au moins.

49
répondu jonasfj 2014-01-27 18:13:44

Une alternative en utilisant envsubst sans perdre la possibilité d'utiliser des commandes comme COPY ou ADD, et sans utiliser de fichiers intermédiaires serait d'utiliser la Substitution de processus de Bash :

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

NOTE: voulait à l'origine Ajouter un commentaire à la réponse de jonasfj mais il semble que je n'ai pas assez de réputation.

11
répondu L. Alberto Giménez 2017-05-23 12:26:24

Charge les variables d'environnement à partir d'un fichier que vous créez lors de l'exécution.

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

... puis dans le Dockerfile

ADD build /build
RUN /build/test.sh

Où test.sh charge MYVAR de env.sh

#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile
9
répondu Dan C 2015-03-19 22:57:57

Si vous voulez juste trouver et remplacer toutes les variables d'environnement ($ExampleEnvVar) dans un Dockerfile alors construisez-le cela fonctionnerait:

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

2
répondu snassr 2017-10-31 19:30:54

Ajouter -e clé pour passer des variables d'environnement au conteneur. exemple:

$ 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
répondu Valentin Kantor 2014-01-26 20:45:07