我想知道如何从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 {}
我想知道如何从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 {}
你可以用类似
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
作品和更短,当然,我发布了“旧”的语法。
这似乎并不可能,你可以列出的环境变量,但不只是一个。
$ 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"
您也可以使用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
@ user2915097有趣。我已将您的评论纳入答案中,以获得更多的知名度。 – VonC
一个非常方便的选择是:
docker exec 1e2b8689cf06 sh -c 'echo $PATH'
诚然,这是不使用docker inspect
,但仍..
我觉得它更好地解析为环境变量名称比您依赖索引感兴趣。
echo $(docker inspect --format '{{ .Config.Env }}' mysql) | tr ' ' '\n' | grep MYSQL_ROOT_PASSWORD | sed 's/^.*=//'
对于那些寻找一个模板只只使用泊坞窗检查(当你不能只是掏出和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
如果你想希望能够检查操作的成功,你可以一起去:
(
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
$
这是一个很好的方式,很好理解和重用。也许你应该添加上面的代码是shell脚本的信息,并且是docker-extract(.sh)的内容。 –
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
。
woow谢谢。这工作完美。 –
我没有立即注意到你的答案。 +1 – VonC
我创建了一个PR来更新'docker inspect'的文档https://github.com/docker/docker/pull/13405 – user2915097
如果你想打印出所有的环境变量,使用下面的命令:$ docker inspect - -format'{{(index.Config.Env)}}'' – pretzels1337