2015-12-02 18 views
30

Was ist der einfachste Weg, um eine Umgebungsvariable aus einem Docker Container , die nicht in der Dockerfile deklariert wurde, zu erhalten?Get Umgebungsvariable von Docker Container

Zum Beispiel eine Umgebungsvariable, die durch einige docker exec container /bin/bash Sitzung gesetzt wurde?

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

Ich habe versucht mit docker exec container echo "$ENV_VAR", aber die Substitution scheint außerhalb des Containers passieren, so dass ich nicht die env var aus dem Container, sondern eher die env var von meinem eigenen Computer.

Danke.

+0

Gibt es einen Grund, warum nicht env und grep verwenden möchten? – aisbaa

+0

Ich brauche nur den Wert. Wenn ich das richtig verstehe, müsste ich die Ausgabe des Grep-Calls parsen, und das würde ich lieber vermeiden. – Citronen

+0

Ich hatte gedacht, dass Variable, die in einer exec-Sitzung gesetzt wurde, nicht den primären Prozess oder nachfolgende exec-Sitzungen beeinflusst? –

Antwort

54

Der richtige Weg echo "$ENV_VAR" im Innern des Behälters zu laufen, so dass die Variablensubstitution in dem Behälter passiert ist:

docker exec container bash -c 'echo "$ENV_VAR"' 
+0

HINWEIS, dass alle diese Antworten von einer Shell abhängen. Ich bin nicht in der Lage, Env-Variablen mit einer ausführbaren Datei und einem Scratch-Basis-Image zu erhalten. – Richard

+0

'docker run --rm -it CONTAINER bash -c 'echo" $ MY_ENV_VAR "'' – Henrik

23

alle env Variablen an:

arbeitet
docker exec container env | grep VARIABLE | cut -d'=' -f2 
+0

Meine Frage besagt, dass ich es vorziehen würde, diesen Weg nicht zu gehen. Auch folgende Frage: 'docker exec container env' und' docker exec -it container/bin/bash' und dann 'env' spuckt verschiedene Dinge aus. Warum? – Citronen

+0

Ah ... könnte die spezifische Art sein, wie ich das Docker-Bild baue, das dies der Fall macht ... – Citronen

+0

Hm, viel schwerer jetzt. Versuchen Sie 'docker inspect container'. – aisbaa

0

@ aisbaa Antwort, wenn Sie die Umgebungsvariable ist es egal, wenn erklärt wurde:

docker exec container env 

eins zu bekommen. Wenn Sie die Umgebungsvariable wollen, auch wenn es innerhalb einer exec /bin/bash Sitzung erklärt wurde, verwenden Sie so etwas wie:

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

Es ist nicht sehr schön, aber es bekommt den Job zu erledigen.

dann auf den Wert, den Einsatz zu erhalten:

echo ${out[1]} 
+0

Siehe jwodders Antwort. – Citronen

26

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

docker exec container printenv VARIABLE 
12

Der Nachteil docker exec der Verwendung ist, dass es ein läuft Behälter erfordert, so könnte docker inspect -f nützlich sein, wenn Sie ein Container nicht sicher sind, ausgeführt wird.

Beispiel # 1. Ausgabe einer Liste durch Leerzeichen getrennte Umgebungsvariablen im angegebenen Container:

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

die Ausgabe wie folgt aussehen:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3 

Beispiel # 2.

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

ausgeben wird: Ausgang jeder env var auf neue Linie und grep die benötigten Elemente, beispielsweise die Einstellungen des mysql-Container wie dies könnte abgerufen

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

Beispiel # 3. Nehmen wir das Beispiel oben ändern, um eine bash freundliche Ausgabe zu erhalten, die direkt in Ihre Skripte verwendet werden können:

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

AUSGABE:

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 tauchen, dann gehen Sie zu Go's text/template Paket-Dokumentation mit allen Details des Formats.