Come ottenere la variabile ENV quando si effettua il controllo Docker

Mi chiedo come ottengo una variabile di ambiente da ispezionare docker.

quando corro

docker inspect -f "{{.Config.Env.PATH}} " 1e2b8689cf06 

ottengo il seguente

 FATA[0000] template: :1:9: executing "" at : can't evaluate field PATH in type interface {} 

È ansible ottenere direttamente con un comando simile a

 docker inspect --format '{{ index (index .Config.Env) 1 }}' 797 

che mostra per me

 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 

Noterai che sostituire il 1 per 0 come

 docker inspect --format '{{ index (index .Config.Env) 0 }}' 797 

 DISPLAY=:0 

In effetti avevo notato quanto segue per vari docker inspect da una visualizzazione più generale a una più precisa

 docker inspect --format '{{ (.NetworkSettings.Ports) }}' 87c map[8000/tcp:[map[HostIp:0.0.0.0 HostPort:49153]]] docker inspect --format '{{ ((index .NetworkSettings.Ports "8000/tcp") 0) }}' 87c [map[HostIp:0.0.0.0 HostPort:49153]] docker inspect --format '{{ index (index .NetworkSettings.Ports "8000/tcp") 0 }}' 87c map[HostIp:0.0.0.0 HostPort:49153] docker inspect --format '{{ (index (index .NetworkSettings.Ports "8000/tcp") 0).HostIp }}' 87c 0.0.0.0 docker inspect --format '{{ (index (index .NetworkSettings.Ports "8000/tcp") 0).HostPort }}' 87c 49153 

Nota: docker inspect -f funziona ed è più breve, naturalmente, ho postato la syntax “vecchia”.

Questo non sembra ansible, puoi elencare le variabili d’ambiente ma non solo una.

Dalla finestra mobile, eseguire il commit del documento

 $ sudo docker inspect -f "{{ .Config.Env }}" c3f279d17e0a [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin] $ sudo docker commit --change "ENV DEBUG true" c3f279d17e0a SvenDowideit/testimage:version3 f5283438590d $ sudo docker inspect -f "{{ .Config.Env }}" f5283438590d [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DEBUG=true] 

Puoi stamparli:

 docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' 

(come in)

 $ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' c3fa3ce1622b HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 

Aggiungi un grep PATH e potresti ottenere solo il valore PATH=xxx .


user2915097 menziona nei commenti jq, un processore JSON leggero e flessibile della riga di comando , utilizzato nell’articolo ” Docker Inspect Template Magic ” per formattare bene il campo necessario:

 docker inspect -f '{{json .State}}' jenkins-data | jq '.StartedAt' "2015-03-15T20:26:30.526796706Z" 

Un’opzione molto comoda che non richiede strumenti esterni è:

 docker exec 1e2b8689cf06 sh -c 'echo $PATH' 

Ammettiamo che questo non sta usando l’ docker inspect , ma comunque ..

Trovo che sia meglio analizzare il nome della variabile d’ambiente che interessa, basandosi sull’indice.

 echo $(docker inspect --format '{{ .Config.Env }}' mysql) | tr ' ' '\n' | grep MYSQL_ROOT_PASSWORD | sed 's/^.*=//' 
 docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' CONTAINER-NAME | grep -P "^YOUR_VAR=" | sed 's/[^=]*=//' 

Questa soluzione richiede grep (con opzione -P), sed e capacità di pipeline ma risolve 2 problemi che la maggior parte delle altre soluzioni non risolve.

In primo luogo, esegue una corrispondenza esatta sul nome della variabile. Ad esempio se hai le seguenti variabili:

 YOUR_VAR=value ANOTHER_YOUR_VAR=value2 OTHER_VAR=YOUR_VAR 

Riceverai correttamente un value .

In secondo luogo, gestisce correttamente i casi in cui il valore variabile contiene = caratteri. Per esempio:

 REBEL_OPTS=-Drebel.stats=false 

Otterrai correttamente te -Drebel.stats=false invece di false .

Per coloro che sono alla ricerca di una soluzione solo per modelli che utilizza solo la finestra mobile inspect (quando non è ansible eseguire il shell out e grep, ecc.), Il seguente esempio funziona (come da docker 1.11+):

 > docker inspect -f '{{range $index, $value := .Config.Env}}{{if eq (index (split $value "=") 0) "SOME_VAR" }}{{range $i, $part := (split $value "=")}}{{if gt $i 1}}{{print "="}}{{end}}{{if gt $i 0}}{{print $part}}{{end}}{{end}}{{end}}{{end}}' *container_name* 
  • gestisce anche variabili di ambiente con extra ‘=’

Esempio di contenitore:

 > docker run -d -e --name sleeper SOME_VAR=key=value alpine:3.4 -sh 'sleep 9999' 

Estrai SOME_VAR con:

 > docker inspect -f '{{range $index, $value := .Config.Env}}{{if eq (index (split $value "=") 0) "SOME_VAR" }}{{range $i, $part := (split $value "=")}}{{if gt $i 1}}{{print "="}}{{end}}{{if gt $i 0}}{{print $part}}{{end}}{{end}}{{end}}{{end}}' sleeper 

Se vuoi essere in grado di verificare il successo dell’operazione potresti andare con:

 ( for env in $(docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' ${2}); do if [[ "${env}" == "${1}"* ]]; then echo ${env#${1}=} exit 0 fi done exit 1 ) 

Questo aprirà una subshell e restituirà a seconda se trovato:

 $ docker-extract PATH docker_image || echo not found /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $ docker-extract NON_EXISTENT_ENV docker_image || echo not found not found $