Umgebungsvariable aus Docker-Container abrufen

124

Was ist der einfachste Weg, um eine Umgebungsvariable aus einem Docker-Container abzurufen, der nicht in der Docker-Datei deklariert wurde ?

Zum Beispiel eine Umgebungsvariable, die in einer docker exec container /bin/bashSitzung festgelegt wurde?

Ich kann es tun docker exec container env | grep ENV_VAR, aber ich würde etwas bevorzugen, das nur den Wert zurückgibt.

Ich habe versucht, zu verwenden docker exec container echo "$ENV_VAR", aber die Ersetzung scheint außerhalb des Containers zu erfolgen, sodass ich die env-Variable nicht aus dem Container, sondern die env-Variable von meinem eigenen Computer erhalte.

Vielen Dank.

Citronen
quelle
Gibt es einen Grund, warum Sie env und grep nicht verwenden möchten?
Aisbaa
Ich brauche nur den Wert. Wenn ich das richtig verstehe, muss ich die Ausgabe des grep-Aufrufs analysieren, und das möchte ich lieber vermeiden.
Citronen
Ich hatte gedacht, dass eine Variable, die in einer Exec-Sitzung festgelegt wurde, den primären Prozess oder nachfolgende Exec-Sitzungen nicht beeinflusst.
Paul Becotte

Antworten:

136

Die ordnungsgemäße Ausführung echo "$ENV_VAR"im Container, damit die Variablensubstitution im Container erfolgt, ist:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'
jwodder
quelle
4
HINWEIS, dass alle diese Antworten von einer Shell abhängen. Ich kann keine env-Variablen mit einer ausführbaren Datei und einem Scratch-Basis-Image abrufen.
Richard
docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik
Ich erhalte die Fehlermeldung "Fehler: Kein solcher Container: Container". Ich führe den Befehl nach der Anmeldung über SSH aus.
Kunwar Nitesh
1
@kunwarnitesh: Sie müssen "container" durch den Namen des Containers ersetzen, mit dem Sie arbeiten möchten.
Jwodder
1
Machen Sie das containerWort so, dass die Leute verstehen, dass es eine Variable ist
Anwar
117

So zeigen Sie alle env-Variablen an:

docker exec container env

Um einen zu bekommen:

docker exec container env | grep VARIABLE | cut -d'=' -f2
aisbaa
quelle
Meine Frage besagt, dass ich diesen Weg lieber nicht gehen würde. Auch Folgefrage: docker exec container envund docker exec -it container /bin/bashund dann envverschiedene Dinge ausspucken. Warum?
Citronen
Ah ... könnte die spezifische Art sein, wie ich das Docker-Image erstelle, das dies der Fall macht ...
Citronen
2
Hm, jetzt viel schwieriger. Versuchen Sie es docker inspect container.
Aisbaa
docker inspect containerscheint die gleiche Einschränkung zu haben. Wenn ich nach dem Ausführen des Containers eine Umgebungsvariable erstelle, wird diese nicht in einem Aufruf von docker inspect(im Abschnitt env) angezeigt.
Citronen
Ich glaube, dies ist eine bessere Antwort als die derzeit akzeptierte Antwort. Wir haben bashzum Beispiel mehrere Container, die nicht mit Befehl unterstützt werden alpine-node. Die Verwendung exec container bash -c "echo $ENV_VAR"funktioniert also nicht. Mit exec container envArbeiten für meinen Fall. Verwenden exec container printenvfunktioniert auch.
Rahmatns
77

Sie können printenv VARIABLEanstelle von verwenden /bin/bash -c 'echo $VARIABLE. Es ist viel einfacher und führt keine Substitution durch:

docker exec container printenv VARIABLE
Gentooboontoo
quelle
7
Dies sollte die endgültige Antwort sein
Ki Jéy
3
oder einfach printenvum alle Variablen zu drucken.
NaXa
Dies funktioniert auch für Kubernetes: kubectl exec pod-name printenv MY_VARIABLE.
Teebu
58

Der Nachteil der Verwendung docker execbesteht darin, dass ein laufender Container erforderlich ist. docker inspect -fDies kann hilfreich sein, wenn Sie nicht sicher sind, ob ein Container ausgeführt wird.

Beispiel 1. Geben Sie eine Liste der durch Leerzeichen getrennten Umgebungsvariablen im angegebenen Container aus:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name

Die Ausgabe sieht folgendermaßen aus:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Beispiel 2. Geben Sie jede env var in einer neuen Zeile und grepdie benötigten Elemente aus. Beispielsweise können die Einstellungen des MySQL-Containers wie folgt abgerufen werden:

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_

wird ausgegeben:

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52

Beispiel 3. Lassen Sie uns das obige Beispiel ändern, um eine bash-freundliche Ausgabe zu erhalten, die direkt in Ihren Skripten verwendet werden kann:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL

wird ausgegeben:

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

Wenn Sie tiefer eintauchen möchten, lesen Sie die Dokumentation zum Text- / Vorlagenpaket von Go mit allen Details des Formats.

Sergiy Sokolenko
quelle
1
Das ist die beste Antwort. Ich denke, es sollte die Antwort auf eine separate Frage sein (wenn der Container unten ist)
Nickolay Kondratenko
Dies ist die einzige Antwort, die für mich funktioniert hat. docker execIch habe immer gesagt, mein Container ist nicht bekannt.
Gute Nacht Nerd Pride
7

Keine der obigen Antworten zeigt Ihnen, wie Sie eine Variable aus einem nicht laufenden Container extrahieren (wenn Sie den echoAnsatz mit verwendenrun , erhalten Sie keine Ausgabe).

Einfach runmit printenv, wie so:

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

(Beachten Sie, dass docker-composestatt dockerfunktioniert auch)

Sarink
quelle
Sehr einfach! Ich habe mich für diesen Ansatz entschieden.
Opncow
oder einfach printenvum alle Variablen zu drucken.
NaXa
2

Wird durch Zufall Sie verwenden VSCode und hat die installierte Docker Erweiterung , nur right+ clickauf der Docker Sie (innerhalb des zu überprüfenden Docker Erweiterung ), clickauf Inspizieren und dort für die Suche env finden Sie alle Ihre finden env Variablen Werte

ddieppa
quelle
0

Die Antwort von @ aisbaa funktioniert, wenn es Ihnen egal ist, wann die Umgebungsvariable deklariert wurde. Wenn Sie die Umgebungsvariable möchten, auch wenn sie innerhalb einer exec /bin/bashSitzung deklariert wurde , verwenden Sie Folgendes:

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)

Es ist nicht sehr hübsch, aber es erledigt den Job.

Verwenden Sie:

echo ${out[1]}
Citronen
quelle
Siehe die Antwort von jwodder.
Citronen
0

Dieser Befehl überprüft die Umgebung der Docker-Stack-Prozesse auf dem Host:

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

Wir können entrypointeinen nicht laufenden Container mit dem änderndocker run Befehl .

Beispiel show PATH Umgebungsvariable:

  1. using bashund echo: Diese Antwort behauptet, dass echokeine Ausgabe erzeugt wird, was falsch ist.

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

    docker run --rm --entrypoint printenv <container> PATH
Sathish
quelle