Je construis un conteneur pour une application ruby. La configuration de mon application est contenue dans des variables d'environnement (chargées à l'intérieur de 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 trucs.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
Tout passe cependant la chaîne "REQUEST_DOMAIN" au lieu de la valeur de la variable d'environnement. Existe-t-il un moyen de transmettre des valeurs de variables d'environnement de la machine hôte au conteneur?
Your image will not build if you have referenced an ARG in your Dockerfile but excluded it in --build-arg
Vous avez tort. Vous pouvez créer une image avec des références même sans --build-arg. De plus, vous pouvez définir la valeur par défaut pour l'argument de génération.Vous pouvez donc faire:
cat Dockerfile | envsubst | docker build -t my-target -
Ensuite, ayez un Dockerfile avec quelque chose comme:
Je suppose qu'il pourrait y avoir un problème avec certains caractères spéciaux, mais cela fonctionne au moins dans la plupart des cas.
la source
envsubst
partiebrew install gettext
. Mais à cause des conflits possibles avec le système de construction BSD, il est "uniquement en fût" et aucun symlnks n'est fait. Cependant, il est prudent d'ln -s /usr/local/Cellar/gettext/*/bin/envsubst /usr/local/bin/
ajouter cette commande à votre PATH. (Ce sont vraiment les bibliothèques qui sont la préoccupation.) Ou vous pouvez l'utiliser à son/usr/local/Cellar/gettext/*/bin/envsubst
emplacementdocker build -
, en particulier, ce qui ne fonctionne pas lorsque vous référencez des chemins relatifs à partir de votre Dockerfile, indépendamment de la substitution env var.docker build
place. Exemple:,cat Dockerfile | envsubst > DockerfileWithEnvVars
alorsdocker build -t my-target -f DockerfileWithEnvVars .
, alorsrm DockerfileWithEnvVars
envsubst < Dockerfile | sponge Dockerfile
Une alternative utilisant
envsubst
sans perdre la possibilité d'utiliser des commandes commeCOPY
ouADD
, et sans utiliser de fichiers intermédiaires serait d'utiliser la substitution de processus de Bash :la source
unable to prepare context: the Dockerfile (/dev/fd/63) must be within the build context
Chargez les variables d'environnement à partir d'un fichier que vous créez lors de l'exécution.
... puis dans le Dockerfile
où test.sh charge MYVAR depuis env.sh
la source
Si vous souhaitez simplement rechercher et remplacer toutes les variables d'environnement ($ ExampleEnvVar) dans un Dockerfile, puis créez-le, cela fonctionnerait:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
la source
envsubst < ./Dockerfile | docker build -squash -t ${DOCKIMG}:${VERSION} . -f -
où laFROM
ligne utilise la variable d'environnement.ajouter une
-e
clé pour passer des variables d'environnement au conteneur. exemple:la source