Obtenir la variable d'environnement à partir du conteneur Docker

126

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

Par exemple, une variable d'environnement qui a été définie via une docker exec container /bin/bashsession?

Je peux le faire docker exec container env | grep ENV_VAR, mais je préférerais quelque chose qui renvoie simplement la valeur.

J'ai essayé d'utiliser docker exec container echo "$ENV_VAR", mais la substitution semble se produire en dehors du conteneur, donc je n'obtiens pas le var env du conteneur, mais plutôt le var env de mon propre ordinateur.

Merci.

Citronen
la source
Y a-t-il une raison pour laquelle vous ne voudriez pas utiliser env et grep?
aisbaa
J'ai juste besoin de la valeur. Si je comprends bien, j'aurais besoin d'analyser la sortie de l'appel grep, et je préfère éviter cela.
Citronen
J'avais pensé que la variable définie dans une session d'exécution n'affectait pas le processus principal ou les sessions d'exécution suivantes?
Paul Becotte

Réponses:

139

La bonne façon de s'exécuter echo "$ENV_VAR"à l'intérieur du conteneur afin que la substitution de variable se produise dans le conteneur est:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'
jwodder
la source
4
REMARQUE: toutes ces réponses dépendent d'un shell. Je ne parviens pas à obtenir des variables d'environnement avec un exécutable et une image de base scratch.
Richard
docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik
J'obtiens l'erreur "Erreur: aucun conteneur de ce type: conteneur". J'exécute la commande après la connexion via SSH.
kunwar nitesh
1
@kunwarnitesh: Vous devez remplacer "container" par le nom du conteneur sur lequel vous souhaitez opérer.
jwodder
1
Faire containermot tel que les gens comprennent qu'il est une variable
Anwar
117

Pour afficher toutes les variables d'environnement:

docker exec container env

Pour en obtenir un:

docker exec container env | grep VARIABLE | cut -d'=' -f2
aisbaa
la source
Ma question dit que je préfère ne pas suivre cette voie. En outre, la question de suivi: docker exec container envet docker exec -it container /bin/bashpuis envcracher des choses différentes. Pourquoi?
Citronen
Ah ... c'est peut-être la manière spécifique dont je construis l'image de docker qui rend cela le cas ...
Citronen
2
Hm, beaucoup plus difficile maintenant. Essayez docker inspect container.
aisbaa
docker inspect containersemble avoir la même limitation. Si je crée une variable d'environnement après avoir exécuté le conteneur, elle n'apparaît pas dans un appel à docker inspect(dans la section env).
Citronen
Je pense que c'est une meilleure réponse que la réponse actuellement acceptée. Nous avons plusieurs conteneurs qui ne sont pas pris en charge avec la bashcommande, par exemple alpine-node. Donc utiliser exec container bash -c "echo $ENV_VAR"ne fonctionne pas. Utiliser des exec container envœuvres pour mon cas. L'utilisation exec container printenvfonctionne également.
rahmatns le
78

Vous pouvez utiliser à la printenv VARIABLEplace de /bin/bash -c 'echo $VARIABLE. C'est beaucoup plus simple et cela n'effectue pas de substitution:

docker exec container printenv VARIABLE
gentooboontoo
la source
7
Cela devrait être la réponse finale
Ki Jéy
5
ou simplement printenvpour imprimer toutes les variables.
naXa
Cela fonctionne même pour kubernetes: kubectl exec nom-pod printenv MY_VARIABLE.
Teebu
58

L'inconvénient de l'utilisation docker execest qu'elle nécessite un conteneur en cours d'exécution , elle docker inspect -fpeut donc être pratique si vous n'êtes pas sûr qu'un conteneur est en cours d'exécution.

Exemple 1. Génère 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 n ° 2. Sortez chaque variable d'environnement sur une nouvelle ligne et greples éléments nécessaires, par exemple, les paramètres du conteneur mysql pourraient être récupérés comme ceci:

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 n ° 3. Modifions l'exemple ci-dessus pour obtenir une sortie conviviale bash qui peut être directement utilisée 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 souhaitez approfondir, accédez à la documentation du package texte / modèle de Go avec tous les détails du format.

Sergiy Sokolenko
la source
1
c'est la meilleure réponse. Je pense que cela devrait être la réponse à une question distincte (lorsque le conteneur est en panne)
Nickolay Kondratenko
C'est la seule réponse qui a fonctionné pour moi. docker exectoujours dit que mon conteneur ne sait pas.
Good Night Nerd Pride
7

Aucune des réponses ci-dessus ne vous montre comment extraire une variable d'un conteneur non en cours d'exécution (si vous utilisez l' echoapproche avec run, vous n'obtiendrez aucune sortie).

Simplement runavec printenv, comme ça:

docker run --rm <container> printenv <MY_VAR>

(Notez qu'au docker-composelieu de dockerfonctionne aussi)

couler
la source
très simple! J'ai opté pour cette approche.
ouvrir le
ou simplement printenvpour imprimer toutes les variables.
naXa
2

Si par hasard vous utilisez VSCode et avez installé l' extension docker , juste right+ clicksur le docker que vous voulez vérifier (dans l' extension docker ), clicksur Inspect , et là, recherchez env , vous trouverez toutes vos valeurs de variables d'env.

ddieppa
la source
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 exec /bin/bashsession, 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 cela fait le travail.

Pour ensuite obtenir la valeur, utilisez:

echo ${out[1]}
Citronen
la source
Voir la réponse de jwodder.
Citronen
0

Cette commande inspecte l'environnement des processus de la pile docker dans l'hôte:

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0
MatteoOreficeIT
la source
0

Nous pouvons modifier entrypointun conteneur non en cours d'exécution avec la docker runcommande.

Exemple de variable d'environnement show PATH:

  1. using bashand echo: Cette réponse prétend qu'il echone produira aucune sortie, ce qui est incorrect.

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. en utilisant printenv

    docker run --rm --entrypoint printenv <container> PATH
Sathish
la source