2015-05-20 12 views

risposta

14

si può ottenere direttamente con un comando simile a

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

che spettacoli per me

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

Si noterà che la sostituzione del 1 da 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 più generale per una visualizzazione 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 

N Nota: docker inspect -f funziona ed è più breve, naturalmente, ho pubblicato la sintassi "vecchia".

+0

Non ho notato la tua risposta subito. +1 – VonC

+0

Ho creato un PR per l'aggiornamento dei documenti per 'docker inspect' https://github.com/docker/docker/pull/13405 – user2915097

+0

Se si desidera stampare tutte le variabili di ambiente, utilizzare il seguente comando: $ docker inspect - -format '{{(index .Config.Env)}}' – pretzels1337

14

Questo non sembra essere possibile, è possibile elencare le variabili di ambiente, ma non solo.

Dal docker commit doc

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

È possibile stampare:

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 si potrebbe ottenere solo il valore PATH=xxx.


user2915097 menzioni in the commentsjq, a lightweight and flexible command-line JSON processor, utilizzato nell'articolo "Docker Inspect Template Magic" per formattare bene il campo necessaria:

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

puoi anche utilizzare lo strumento jq https://stedolan.github.io/jq/ come in questo esempio da http://container-solutions.com/2015/03/docker-inspect-template-magic/ ' docker inspect -f '{{json .State}}' jenkins-data | jq' mostra quindi ''.StartedAt' " 2015-03-15T20: 26: 30.526796706Z "' per formattare bene il campo richiesto – user2915097

+0

@ user2915097 Interessante. Ho incluso il tuo commento nella risposta per maggiore visibilità. – VonC

7

Un'opzione molto conveniente che non richiede alcun attrezzo esterno è:

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

Certo questo non sta usando docker inspect, ma ancora ..

4

trovo meglio analizzare per l'ambiente variabile nome il tuo interesse piuttosto che fare affidamento sull'indice.

echo $(docker inspect --format '{{ .Config.Env }}' mysql) | tr ' ' '\n' | grep MYSQL_ROOT_PASSWORD | sed 's/^.*=//' 
3

Per chi cerca un modello solo soluzione utilizzando solo finestra mobile ispezionare (quando non si può semplicemente sborsare e grep, ecc), il seguente esempio funziona (come di finestra mobile 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 le variabili d'ambiente con extra '='

contenitore Esempio:

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

estratto 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 
2

Se si desidera vuole essere in grado di verificare il successo di operazione che si potrebbe 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 
$ 
+1

è un ottimo modo, buono da capire e riutilizzare. forse dovresti aggiungere le informazioni che il codice precedente è uno script di shell ed è il contenuto di docker-extract (.sh). –

2
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 la capacità di tubazione loro ma risolve 2 problemi che la maggior parte delle altre soluzioni non.

Innanzitutto, esegue la corrispondenza esatta sul nome della variabile. Per esempio, se avete seguenti variabili:

YOUR_VAR=value 
ANOTHER_YOUR_VAR=value2 
OTHER_VAR=YOUR_VAR 

Potrai ricevere correttamente value.

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

REBEL_OPTS=-Drebel.stats=false 

Will correttamente farti -Drebel.stats=false invece di false.

+0

woow Grazie. Questo funziona perfettamente. –

Problemi correlati