如何在进行Docker Inspect时获取ENV变量

时间:2015-05-20 07:16:24

标签: docker

我想知道如何从docker inspect获取一个Environment变量。

我跑的时候

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 {}

8 个答案:

答案 0 :(得分:21)

您可以直接使用类似于

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

为我显示

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

您会注意到将1替换为0,如

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有效并且更短,当然,我发布了#34; old&#34;语法。

答案 1 :(得分:19)

这似乎不可能,您可以列出环境变量,但不仅仅列出一个。

来自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 comments jq, 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"

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:7)

对于那些仅使用 docker inspect 寻找 仅模板 解决方案的人(当你不能只是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*
  • 它甚至可以使用额外的'='
  • 来处理环境变量

示例容器:

> 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

答案 4 :(得分:5)

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

此解决方案需要grep(使用-P选项),sed并能够管理它们,但解决了大多数其他解决方案无法解决的2个问题。

首先,它对变量名执行完全匹配。例如,如果您有以下变量:

YOUR_VAR=value
ANOTHER_YOUR_VAR=value2
OTHER_VAR=YOUR_VAR

您将正确接收value

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

REBEL_OPTS=-Drebel.stats=false

将正确地为您-Drebel.stats=false而不是false

答案 5 :(得分:4)

我发现解析您感兴趣的环境变量 name 比依赖索引更好。

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

答案 6 :(得分: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
)

这将打开一个子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
$

答案 7 :(得分:1)

Docker格式设置选项非常有限,jq功能更强大:

docker inspect 1e2b8689cf06 | jq '.[] | .Config.Env[] | select(test("^PATH=*"))'

或将Docker格式与jq结合使用,同时仅将Env变量传递给jq:

docker inspect -f '{{json .Config.Env }}' 1e2b8689cf06 | jq '.[] | select(test("^PATH=*"))'

假设容器中有一个printenv,则可以使用简单的grep

docker exec -i 1e2b8689cf06 printenv | grep -oP '(?<=PATH=).*'

-o将忽略结果中匹配的PATH=部分。语法比模板魔术更容易阅读。