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.