2015-12-02 10 views
30

Jaki jest najprostszy sposób pobrania zmiennej środowiskowej z kontenera dokowanego , który nie został zadeklarowany w pliku Dockerfile?Pobierz zmienną środowiskową ze zbiornika Docker

Na przykład, zmienna środowiskowa ustawiona w ramach pewnej sesji docker exec container /bin/bash?

Mogę zrobić docker exec container env | grep ENV_VAR, ale wolałbym coś, co po prostu zwraca wartość.

Próbowałem używać docker exec container echo "$ENV_VAR", ale podstawienie wydaje się zdarzyć poza kontenerem, więc nie otrzymam env var od kontenera, ale raczej env var z mojego własnego komputera.

Dzięki.

+0

Czy istnieje powód, dla którego nie chciałbyś używać env i grep? – aisbaa

+0

Po prostu potrzebuję wartości. Jeśli dobrze zrozumiem, będę musiał przeanalizować wynik wywołania grep i wolałbym tego uniknąć. – Citronen

+0

Myślałem, że zmienna, która została ustawiona w sesji exec nie wpływa na proces podstawowy lub kolejne sesje exec? –

Odpowiedz

54

Właściwym sposobem uruchomienia echo "$ENV_VAR" wewnątrz pojemnika tak, że zmienna podstawienie dzieje w zbiorniku:

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

UWAGA, że wszystkie te odpowiedzi zależą od powłoki. Nie mogę uzyskać zmiennych env z plikiem wykonywalnym i podstawowym obrazem podstawowym. – Richard

+0

'uruchomienie dockera --rm -it CONTAINER bash -c 'echo" $ MY_ENV_VAR "'' – Henrik

23

Aby wyświetlić wszystkie zmienne env:

docker exec container env 

Aby dostać jeden:

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

Moje pytanie mówi, że wolałbym nie iść tą drogą. Również pytanie uzupełniające: 'docker exec container env' i' docker exec -it container/bin/bash', a następnie 'env' wypluwają różne rzeczy. Czemu? – Citronen

+0

Ah ... może być specyficzny sposób, w jaki buduję obraz dokowania, który sprawia, że ​​tak jest ... – Citronen

+0

Hm, o wiele trudniej teraz. Spróbuj "doker sprawdzić kontener". – aisbaa

0

@ odpowiedź aisbaa za roboty, jeśli nie obchodzi, gdy zmienna została zadeklarowana. Jeśli chcesz zmienną środowiskową, nawet jeżeli została zadeklarowana wewnątrz sesji exec /bin/bash używać coś takiego:

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

To nie jest bardzo ładna, ale dostaje zadanie.

Aby następnie uzyskać wartość, przeznaczenie:

echo ${out[1]} 
+0

Zobacz odpowiedź jwoddera. – Citronen

26

Można użyć printenv VARIABLE zamiast /bin/bash -c 'echo $VARIABLE. To znacznie prostsze i nie wykonuje podstawienie:

docker exec container printenv VARIABLE 
12

Minusem korzystania docker exec jest to, że wymaga działa pojemnik, tak docker inspect -f może być przydatne, jeśli nie masz pewności, pojemnik jest uruchomiony.

Przykład # 1. wyjściowy lista przestrzeni oddzielonych zmienne środowiska w określonym zbiornika:

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

wyjście będzie wyglądać następująco:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3 

Przykład # 2. Wyjście każdy var env na nowej linii i grep potrzebne elementy, na przykład ustawienia pojemnika MySQL można pobrać tak: wyjście

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

wola:

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

Przykład # 3. Niech zmodyfikować powyższy przykład, aby uzyskać przyjazne bash wyjście, które można bezpośrednio wykorzystać w skryptach:

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

wyjście wola:

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 

Jeśli chcesz nurkować głębiej, a następnie przejść do Idź do text/template dokumentacji pakietu z wszystkimi szczegółami formatu.

Powiązane problemy