Quel est le moyen le plus simple d'obtenir une variable d'environnement à partir d'un conteneur docker qui n'a pas été déclaré dans le fichier Dockerfile?
Par exemple, une variable d'environnement définie via une session docker exec container /bin/bash
?
Je peux faire docker exec container env | grep ENV_VAR
, mais je préférerais quelque chose qui retourne simplement la valeur.
J'ai essayé d'utiliser docker exec container echo "$ENV_VAR"
, mais la substitution semble se produire en dehors du conteneur. Je ne reçois donc pas la variable env du conteneur, mais plutôt la variable env de mon propre ordinateur.
Merci.
La méthode appropriée pour exécuter echo "$ENV_VAR"
à l'intérieur du conteneur de sorte que la substitution de variable se produise dans le conteneur est la suivante:
docker exec container bash -c 'echo "$ENV_VAR"'
Pour afficher toutes les variables env:
docker exec container env
Pour en obtenir un:
docker exec container env | grep VARIABLE | cut -d'=' -f2
Vous pouvez utiliser printenv VARIABLE
au lieu de /bin/bash -c 'echo $VARIABLE
. C'est beaucoup plus simple et cela n'effectue pas de substitution:
docker exec container printenv VARIABLE
L’inconvénient d’utiliser docker exec
est qu’il faut un conteneur en cours d’exécution , de sorte que docker inspect -f
peut être pratique si vous n'êtes pas sûr le conteneur est en cours d'exécution.
Exemple # 1. Affiche une liste de variables d'environnement séparées par des espaces dans le conteneur spécifié:
docker inspect -f \
'{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name
la sortie ressemblera à ceci:
ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3
Exemple # 2. Affiche chaque variable var sur la nouvelle ligne et grep
les éléments nécessaires. Par exemple, les paramètres du conteneur mysql pourraient être récupérés comme suit: cette:
docker inspect -f \
'{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
container_name | grep MYSQL_
affichera:
MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52
Exemple # 3. Modifions l'exemple ci-dessus pour obtenir un résultat bash friendly utilisable directement dans vos scripts:
docker inspect -f \
'{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
container_name | grep MYSQL
affichera:
export MYSQL_PASSWORD=secret
export MYSQL_ROOT_PASSWORD=supersecret
export MYSQL_USER=demo
export MYSQL_DATABASE=demodb
export MYSQL_MAJOR=5.5
export MYSQL_VERSION=5.5.52
Si vous voulez aller plus loin, allez dans la documentation du paquet text/template de Go avec tous les détails du format.
Aucune des réponses ci-dessus ne vous montre comment extraire une variable d'un conteneur non exécuté (si vous utilisez l'approche echo
avec run
, vous n'obtiendrez aucune sortie).
Simplement run
avec printenv
, comme ceci:
docker run --rm <container> printenv <MY_VAR>
(Notez que docker-compose
au lieu de docker
fonctionne aussi)
Cette commande inspecte l'environnement des processus de la pile de docker dans l'hôte:
pidof dockerd containerd containerd-shim | tr ' ' '\n' \
| xargs -L1 -I{} -- Sudo xargs -a '/proc/{}/environ' -L1 -0
La réponse de @ aisbaa fonctionne si vous ne vous souciez pas du moment où la variable d'environnement a été déclarée. Si vous voulez la variable d'environnement, même si elle a été déclarée à l'intérieur d'une session exec /bin/bash
, utilisez quelque chose comme:
IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)
Ce n'est pas très joli, mais ça fait le travail.
Pour obtenir ensuite la valeur, utilisez:
echo ${out[1]}