Pobierz zmienną środowiskową z kontenera platformy Docker

124

Jaki jest najprostszy sposób uzyskania zmiennej środowiskowej z kontenera platformy Docker, który nie został zadeklarowany w pliku Dockerfile ?

Na przykład zmienna środowiskowa, która została ustawiona podczas jakiejś docker exec container /bin/bashsesji?

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

Próbowałem użyć docker exec container echo "$ENV_VAR", ale wydaje się, że podstawianie odbywa się poza kontenerem, więc nie otrzymuję zmiennej env z kontenera, ale raczej zmienną env z własnego komputera.

Dzięki.

Citronen
źródło
Czy istnieje powód, dla którego nie chcesz używać env i grep?
aisbaa
Po prostu potrzebuję wartości. Jeśli dobrze rozumiem, musiałbym przeanalizować wynik wywołania grep i wolałbym tego uniknąć.
Citronen
Myślałem, że zmienna ustawiona w sesji exec nie wpływa na podstawowy proces ani na kolejne sesje exec?
Paul Becotte

Odpowiedzi:

137

Prawidłowy sposób uruchomienia echo "$ENV_VAR"w kontenerze, aby podstawianie zmiennych następowało w kontenerze, to:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'
jwodder
źródło
4
UWAGA, że wszystkie te odpowiedzi zależą od jakiejś powłoki. Nie mogę uzyskać zmiennych env z plikiem wykonywalnym i podstawowym obrazem scratch.
Richard
docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik,
Pojawia się błąd „Błąd: nie ma takiego kontenera: kontener”. Wykonuję polecenie po zalogowaniu się przez SSH.
kunwar nitesh
1
@kunwarnitesh: Musisz zamienić „pojemnik” na nazwę kontenera, na którym chcesz operować.
jwodder
1
Daj containersłowo tak, aby ludzie zrozumieli, że to zmienna
Anwar
117

Aby wyświetlić wszystkie zmienne env:

docker exec container env

Aby go zdobyć:

docker exec container env | grep VARIABLE | cut -d'=' -f2
aisbaa
źródło
Moje pytanie mówi, że wolałbym nie iść tą drogą. Również kolejne pytanie: docker exec container envi docker exec -it container /bin/bash, a następnie envwypluć różne rzeczy. Czemu?
Citronen
Ach ... może być specyficzny sposób, w jaki buduję obraz dockera, który sprawia, że ​​tak jest ...
Citronen,
2
Hm, teraz dużo trudniej. Spróbuj docker inspect container.
aisbaa
docker inspect containerwydaje się mieć takie same ograniczenia. Jeśli utworzę zmienną środowiskową po uruchomieniu kontenera, nie pojawi się ona w wywołaniu docker inspect(w sekcji env).
Citronen
Uważam, że jest to lepsza odpowiedź niż obecnie akceptowana odpowiedź. Mamy na przykład kilka kontenerów, które nie są obsługiwane przez bashpolecenie alpine-node. Więc używanie exec container bash -c "echo $ENV_VAR"nie działa. Używanie exec container envdziała w moim przypadku. Używanie exec container printenvrównież działa.
rahmatns
78

Możesz użyć printenv VARIABLEzamiast /bin/bash -c 'echo $VARIABLE. Jest znacznie prostszy i nie wykonuje podstawienia:

docker exec container printenv VARIABLE
gentooboontoo
źródło
7
To powinna być ostateczna odpowiedź
Ki Jéy
5
lub po prostu printenvwypisać wszystkie zmienne.
naXa
Działa to nawet w przypadku kubernetes: kubectl exec pod-name printenv MY_VARIABLE.
Teebu
58

Wadą używania docker execjest to, że wymaga działającego kontenera, więc docker inspect -fmoże być przydatne, jeśli nie masz pewności, że kontener działa.

Przykład 1. Wyprowadź listę rozdzielonych spacjami zmiennych środowiskowych w określonym kontenerze:

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

wynik będzie wyglądał następująco:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Przykład nr 2. Wypisz każdą zmienną env w nowej linii i greppotrzebne elementy, na przykład ustawienia kontenera mysql można pobrać w następujący sposób:

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

wyświetli:

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

Przykład nr 3. Zmodyfikujmy powyższy przykład, aby uzyskać przyjazne dla basha wyjście, które może być bezpośrednio użyte w twoich skryptach:

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

wyświetli:

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 zagłębić się głębiej, przejdź do dokumentacji pakietu tekstowego / szablonu Go ze wszystkimi szczegółami formatu.

Sergiy Sokolenko
źródło
1
to najlepsza odpowiedź. Myślę, że to powinna być odpowiedź na osobne pytanie (gdy kontener jest wyłączony)
Nickolay Kondratenko
To jedyna odpowiedź, która mi pomogła. docker execzawsze mówił, że mój pojemnik nie jest znany.
Good Night Nerd Pride
7

Żadna z powyższych odpowiedzi nie pokazuje, jak wyodrębnić zmienną z niedziałającego kontenera (jeśli użyjesz echopodejścia z run, nie otrzymasz żadnych danych wyjściowych).

Po prostu runz printenv, jak to:

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

(Zauważ, że docker-composezamiast dockerdziała też)

sarink
źródło
bardzo proste! Zdecydowałem się na takie podejście.
opncow
lub po prostu printenvwypisać wszystkie zmienne.
naXa
2

Jeśli przypadkiem używasz VSCode i zainstalowałeś rozszerzenie docker , po prostu right+ clickna dockerze, który chcesz sprawdzić (w rozszerzeniu docker ), clickw Inspect , i tam wyszukaj env , znajdziesz wszystkie wartości zmiennych env

ddieppa
źródło
0

Odpowiedź @ aisbaa działa, jeśli nie obchodzi cię, kiedy została zadeklarowana zmienna środowiskowa. Jeśli chcesz zmienną środowiskową, nawet jeśli została zadeklarowana w exec /bin/bashsesji, użyj czegoś takiego:

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

Nie jest zbyt ładny, ale spełnia swoje zadanie.

Aby następnie uzyskać wartość, użyj:

echo ${out[1]}
Citronen
źródło
Zobacz odpowiedź jwodder.
Citronen
0

To polecenie sprawdza środowisko procesów stosu dockera na hoście:

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0
MatteoOreficeIT
źródło
0

entrypointNiedziałający kontener możemy modyfikować docker runpoleceniem.

Przykład pokazuje zmienną środowiskową PATH:

  1. using bashand echo: Ta odpowiedź twierdzi, że echonie da żadnych wyników, co jest niepoprawne.

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

    docker run --rm --entrypoint printenv <container> PATH
Sathish
źródło