Ottieni variabile d'ambiente da Docker Container


126

Qual è il modo più semplice per ottenere una variabile di ambiente da un contenitore Docker che non è stato dichiarato nel Dockerfile ?

Ad esempio, una variabile di ambiente che è stata impostata tramite una docker exec container /bin/bashsessione?

Posso farlo docker exec container env | grep ENV_VAR, ma preferirei qualcosa che restituisca solo il valore.

Ho provato a utilizzare docker exec container echo "$ENV_VAR", ma la sostituzione sembra avvenire al di fuori del contenitore, quindi non ottengo env var dal contenitore, ma piuttosto env var dal mio computer.

Grazie.


C'è un motivo per non utilizzare env e grep?
— aisbaa

Ho solo bisogno del valore. Se ho capito bene, dovrei analizzare l'output della chiamata grep e preferisco evitarlo.
— Citronen

Avevo pensato che la variabile impostata in una sessione di esecuzione non influisse sul processo principale o sulle sessioni di esecuzione successive?
— Paul Becotte

Risposte:


139

Il modo corretto per eseguire echo "$ENV_VAR"all'interno del contenitore in modo che la sostituzione della variabile avvenga nel contenitore è:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

4
NOTA che tutte queste risposte dipendono da qualche shell. Non sono in grado di ottenere variabili env con un eseguibile e un'immagine di base zero.
— Richard

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

Ricevo l'errore "Error: No such container: container". Sto eseguendo il comando dopo il login tramite SSH.
— kunwar nitesh

1
@kunwarnitesh: Devi sostituire "container" con il nome del container su cui vuoi operare.
— jwodder

1
Fai una containerparola in modo che le persone capiscano che è una variabile
— Anwar

117

Per visualizzare tutte le variabili env:

docker exec container env

Per averne uno:

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

La mia domanda dice che preferirei non seguire quella strada. Inoltre, domanda di follow-up: docker exec container enve docker exec -it container /bin/bashpoi envsputare fuori cose diverse. Perché?
— Citronen

Ah ... potrebbe essere il modo specifico in cui sto costruendo l'immagine della finestra mobile che rende questo il caso ...
— Citronen

2
Hm, molto più difficile ora. Prova docker inspect container.
— aisbaa

docker inspect containersembra avere la stessa limitazione. Se creo una variabile di ambiente dopo aver eseguito il contenitore, non appare in una chiamata a docker inspect(nella sezione env).
— Citronen

Credo che questa sia una risposta migliore di quella attualmente accettata. Ad esempio, abbiamo diversi contenitori che non sono supportati con il bashcomando alpine-node. Quindi l'utilizzo exec container bash -c "echo $ENV_VAR"non funziona. Utilizzo di exec container envopere per il mio caso. Anche l'utilizzo exec container printenvfunziona.
— rahmatns

78

Puoi usare al printenv VARIABLEposto di /bin/bash -c 'echo $VARIABLE. È molto più semplice e non esegue la sostituzione:

docker exec container printenv VARIABLE

7
Questa dovrebbe essere la risposta finale
— Ki Jéy

5
o semplicemente printenvper stampare tutte le variabili.
— naXa

Funziona anche per kubernetes: kubectl exec pod-name printenv MY_VARIABLE.
— Teebu

58

Lo svantaggio dell'utilizzo docker execè che richiede un contenitore in esecuzione , quindi docker inspect -fpotrebbe essere utile se non sei sicuro che un contenitore sia in esecuzione.

Esempio 1. Produce un elenco di variabili di ambiente separate da spazi nel contenitore specificato:

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

l'output sarà simile a questo:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Esempio n. 2. Visualizza ogni variabile env su una nuova riga e grepgli elementi necessari, ad esempio, le impostazioni del contenitore mysql potrebbero essere recuperate in questo modo:

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

produrrà:

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

Esempio n. 3. Modifichiamo l'esempio sopra per ottenere un output amichevole di bash che può essere utilizzato direttamente nei tuoi script:

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

produrrà:

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

Se vuoi approfondire, vai alla documentazione del pacchetto di testo / modello di Go con tutti i dettagli del formato.


1
questa è la risposta migliore. Penso che dovrebbe essere la risposta a una domanda separata (quando il contenitore è inattivo)
— Nickolay Kondratenko

Questa è l'unica risposta che ha funzionato per me. docker execha sempre detto che il mio contenitore non è conosciuto.
— Good Night Nerd Pride

7

Nessuna delle risposte precedenti mostra come estrarre una variabile da un contenitore non in esecuzione (se utilizzi l' echoapproccio conrun , non otterrai alcun output).

Semplicemente runcon printenv, in questo modo:

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

(Nota che docker-composeinvece di dockerfunziona anche tu)


molto semplice! Ho optato per questo approccio.
— opncow

o semplicemente printenvper stampare tutte le variabili.
— naXa


0

La risposta di @ aisbaa funziona se non ti interessa quando è stata dichiarata la variabile di ambiente. Se vuoi la variabile d'ambiente, anche se è stata dichiarata all'interno di una exec /bin/bashsessione, usa qualcosa come:

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

Non è molto carino, ma fa il suo lavoro.

Per ottenere quindi il valore, utilizzare:

echo ${out[1]}

Vedi la risposta di jwodder.
— Citronen

0

Questo comando ispeziona l'ambiente dei processi dello stack docker nell'host:

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0

0

Possiamo modificare entrypointun contenitore non in esecuzione con il docker runcomando.

Esempio mostra variabile d'ambiente PATH:

  1. using bashand echo: questa risposta afferma che echonon produrrà alcun output, il che non è corretto.

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

    docker run --rm --entrypoint printenv <container> PATH
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.