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.