如何在进行Docker检查时获取ENVvariables

我不知道如何从docker检查得到一个环境variables。

当我跑步

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 

你会注意到用1代替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 

注意: docker inspect -f工作,并且更短,当然,我发布了“旧”的语法。

这似乎是不可能的,你可以列出环境variables,但不只是一个。

从docker提交文档

 $ 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 在评论 jq中提到了 一个轻量级和灵活的命令行JSON处理器 ,在文章“ Docker Inspect Template Magic ”中使用,以很好地格式化所需的字段:

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

一个非常方便的选项,不需要任何外部工具是:

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

无可否认,这不是使用docker inspect ,但仍然..

我觉得最好是parsing环境variables名称而不是索引。

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

对于那些使用docker inspect模板解决scheme(当你不能仅仅是shell和grep等),下面的例子工作(从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* 
  • 它甚至处理额外的“=”环境variables

示例容器:

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

这将打开一个子shell并返回取决于如果发现:

 $ 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 $ 
 docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' CONTAINER-NAME | grep -P "^YOUR_VAR=" | sed 's/[^=]*=//' 

这个解决scheme需要grep (带-P选项), sed和pipe理它们的能力,但是解决了大多数其他解决scheme不能解决的两个问题。

首先,它对variables名进行精确匹配。 例如,如果你有以下variables:

 YOUR_VAR=value ANOTHER_YOUR_VAR=value2 OTHER_VAR=YOUR_VAR 

你会得到适当的value

其次,它正确地处理了可变值包含=字符的情况。 例如:

 REBEL_OPTS=-Drebel.stats=false 

将正确地让你-Drebel.stats=false而不是false