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

Tri*_*ind 21 docker

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

当我跑

docker inspect -f "{{.Config.Env.PATH}} " 1e2b8689cf06
Run Code Online (Sandbox Code Playgroud)

我得到以下内容

FATA[0000] template: :1:9: executing "" at <.Config.Env.PATH>: can't evaluate field PATH in type interface {}
Run Code Online (Sandbox Code Playgroud)

use*_*097 24

您可以直接使用类似的命令

docker inspect --format '{{ index (index .Config.Env) 1 }}' 797
Run Code Online (Sandbox Code Playgroud)

这对我来说

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)

你会发现,更换10

docker inspect --format '{{ index (index .Config.Env) 0 }}' 797
Run Code Online (Sandbox Code Playgroud)

DISPLAY=:0
Run Code Online (Sandbox Code Playgroud)

事实上,我已经注意到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
Run Code Online (Sandbox Code Playgroud)

注意:docker inspect -f工作并且更短,当然,我发布了"旧"语法.


Von*_*onC 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]
Run Code Online (Sandbox Code Playgroud)

你可以打印出来:

docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}'
Run Code Online (Sandbox Code Playgroud)

(如)

$ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' c3fa3ce1622b
HOME=/
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)

添加一个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"
Run Code Online (Sandbox Code Playgroud)


sla*_*ker 11

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

docker exec 1e2b8689cf06 sh -c 'echo $PATH'
Run Code Online (Sandbox Code Playgroud)

诚然,这不是使用docker inspect,但仍然..


小智 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*
Run Code Online (Sandbox Code Playgroud)
  • 它甚至用额外的'='来处理环境变量

示例容器:

> docker run -d -e --name sleeper SOME_VAR=key=value alpine:3.4 -sh 'sleep 9999'
Run Code Online (Sandbox Code Playgroud)

提取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
Run Code Online (Sandbox Code Playgroud)


Ale*_*nek 7

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

该解决方案需要grep(带有-P选项),sed并且具有对它们进行管道传输的能力,但解决了2个其他大多数解决方案都不需要的问题。

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

YOUR_VAR=value
ANOTHER_YOUR_VAR=value2
OTHER_VAR=YOUR_VAR
Run Code Online (Sandbox Code Playgroud)

您会正确收到的value

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

REBEL_OPTS=-Drebel.stats=false
Run Code Online (Sandbox Code Playgroud)

将正确地-Drebel.stats=false代替您false