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.


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"'

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

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

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.


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ż)


bardzo proste! Zdecydowałem się na takie podejście.
opncow

lub po prostu printenvwypisać wszystkie zmienne.
naXa


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]}

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.