web-dev-qa-db-fra.com

Obtenir la variable d'environnement à partir du conteneur Docker

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.

86
Citronen

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"'
109
jwodder

Pour afficher toutes les variables env:

docker exec container env

Pour en obtenir un:

docker exec container env | grep VARIABLE | cut -d'=' -f2
84
aisbaa

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
52
gentooboontoo

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.

45
Sergiy Sokolenko

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)

3
sarink

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
0
MatteoOreficeIT

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]}
0
Citronen