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?
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.
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.
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.
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
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 -
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