2015-05-20 60 views
11

我想知道如何從docker檢查中獲取環境變量。如何在做Docker時獲取ENV變量檢查

當我運行

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

我得到以下

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

回答

14

你可以用類似

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

命令直接得到哪些爲我顯示

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

你會發現,通過0更換1

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

DISPLAY=:0 

其實我注意到各種docker inspect以下從更一般的,以更精確的顯示

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 ote:docker inspect -f作品和更短,當然,我發佈了「舊」的語法。

不需要任何外部工具
+0

我沒有立即注意到你的答案。 +1 – VonC

+0

我創建了一個PR來更新'docker inspect'的文檔https://github.com/docker/docker/pull/13405 – user2915097

+0

如果你想打印出所有的環境變量,使用下面的命令:$ docker inspect - -format'{{(index.Config.Env)}}'' – pretzels1337

14

這似乎並不可能,你可以列出的環境變量,但不只是一個。

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] 

你可以打印出來:

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

(如)

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

添加grep PATH,你可以只得到PATH=xxx值。


user2915097提到in the commentsjq, a lightweight and flexible command-line JSON processor,文章 「Docker Inspect Template Magic」 中使用很好地格式化所需的字段:

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

您也可以使用jq工具https://stedolan.github.io/jq/,例如http://container-solutions.com/2015/03/docker-inspect-template-magic/' docker inspect -f'{{json .State}}'jenkins-data | jq'顯示那麼''.StartedAt' 「2015-03-15T20:26:30.526796706Z」'很好地格式化所需字段 – user2915097

+0

@ user2915097有趣。我已將您的評論納入答案中,以獲得更多的知名度。 – VonC

7

一個非常方便的選擇是:

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

誠然,這是不使用docker inspect,但仍..

4

我覺得它更好地解析爲環境變量名稱比您依賴索引感興趣。

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

對於那些尋找一個模板只只使用泊塢窗檢查(當你不能只是掏出和grep等)的解決方案,下面的示例(如泊塢窗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* 
  • 它甚至處理的環境變量有額外的 '='

例子容器:

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

提取SOME_VAR有:

> 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

如果你想希望能夠檢查操作的成功,你可以一起去:

(
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 
) 

這將打開一個子外殼並返回取決於如果發現:

$ 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

這是一個很好的方式,很好理解和重用。也許你應該添加上面的代碼是shell腳本的信息,並且是docker-extract(.sh)的內容。 –

2
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' CONTAINER-NAME | grep -P "^YOUR_VAR=" | sed 's/[^=]*=//' 

該解決方案需要grep(帶-P選項),sed和能力,他們的管道,但解決了兩個問題大部分其他解決方案沒有。

首先,它對變量名執行精確匹配。例如,如果您有以下變量:

YOUR_VAR=value 
ANOTHER_YOUR_VAR=value2 
OTHER_VAR=YOUR_VAR 

您將正確收到value

其次,它正確處理可變值包含=字符的情況。例如:

REBEL_OPTS=-Drebel.stats=false 

將正常得到你-Drebel.stats=false,而不是false

+0

woow謝謝。這工作完美。 –