Est-il possible de définir une variable de menu fixe ENV sur le résultat d'une commande? Comme:
ENV MY_VAR whoami
je veux que MY_VAR obtienne la valeur "root" ou tout ce que whoami renvoie
dockerfile
env
Sultanen
la source
la source
Réponses:
En complément de la réponse DarkSideF.
Vous devez être conscient que chaque ligne / commande dans Dockerfile est exécutée dans un autre conteneur.
Vous pouvez faire quelque chose comme ceci:
Ceci est exécuté dans un seul conteneur.
la source
$bleah
est pas disponible partout en dehors de cette commande RUN, même pas sur la ligne suivante dans la même dockerfile, et encore moins dans une autre image , il est basé au large. Fonctionnalité manquante vraiment évidente de docker ici, il semble que l'écriture et la lecture d'un fichier soient le seul moyen de stocker des variables (dynamiques) dans des images et de les passer entre les images, ce qui semble super hacky.J'ai eu le même problème et j'ai trouvé un moyen de définir la variable d'environnement en tant que résultat de la fonction en utilisant la commande RUN dans dockerfile.
Par exemple, je dois définir SECRET_KEY_BASE pour l'application Rails une seule fois sans changer comme le ferait lorsque je lance:
Au lieu de cela, j'écris dans la chaîne Dockerfile comme:
et ma variable d'environnement disponible à partir de la racine, même après la connexion bash. ou peut-être
puis variable disponible dans les commandes CMD et ENTRYPOINT
Docker le cache en tant que couche et ne change que si vous modifiez certaines chaînes avant lui.
Vous pouvez également essayer différentes méthodes pour définir la variable d'environnement.
la source
*.sh
fichier à l'intérieur/etc/profile.d/
est utilisé pour peupler l'environnementÀ ce stade, un résultat de commande peut être utilisé avec
RUN export
, mais ne peut pas être affecté à unENV
variable.Problème connu: https://github.com/docker/docker/issues/29110
la source
Cette réponse est une réponse à @DarkSideF ,
La méthode qu'il propose est la suivante, en
Dockerfile
:( ajout d'une exportation dans le
/etc/bash.bashrc
)C'est bien mais la variable d'environnement ne sera disponible que pour le processus
/bin/bash
, et si vous essayez d'exécuter votre application docker, par exemple une application Node.js,/etc/bash.bashrc
sera complètement ignorée et votre application n'aura pas un seul indice de ceSECRET_KEY_BASE
que vous essayez pour accéderprocess.env.SECRET_KEY_BASE
.C'est la raison pour laquelle le
ENV
mot clé est ce que tout le monde essaie d'utiliser avec une commande dynamique, car chaque fois que vous exécutez votre conteneur ou utilisez unexec
commande, Docker vérifieraENV
et canalisera chaque valeur du processus en cours d'exécution (similaire à-e
).Une solution consiste à utiliser un wrapper (crédit à @duglin dans ce problème github ). Avoir un fichier wrapper (par exemple
envwrapper
) dans la racine de votre projet contenant:puis dans votre
Dockerfile
:la source
En plus de la réponse de @ DarkSideF, si vous souhaitez réutiliser le résultat d'une commande précédente dans votre
Dockerfile
processus de construction , vous pouvez utiliser la solution de contournement suivante:Par exemple :
Pour quelque chose de plus propre, vous pouvez également utiliser l' essentiel suivant qui fournit une petite CLI appelée
envstore.py
:Ou vous pouvez utiliser la bibliothèque python-dotenv qui a une CLI similaire.
la source
Je ne sais pas si c'est ce que vous recherchiez, mais pour injecter des variables ENV ou ARGS dans votre .Dockerfile, construisez ce modèle fonctionne.
dans votre my_build.sh:
pour obtenir un ARG dans votre .Dockerfile, l'extrait de code pourrait ressembler à ceci:
ou pour obtenir un ENV dans votre fichier .Docker, l'extrait de code pourrait ressembler à ceci:
l'idée est que vous exécutez le script shell et qui appelle le .Dockerfile avec les arguments passés en tant qu'options sur la construction.
la source