vwin德赢app
  咨询电话:15184264910

vwin德嬴手机客户端

docker inspect获取详细参数的两种方法

docker inspect xx 返回的是一个json格式的数据

以下为部分返回值

[ { "Id": "706813b0da107c4d43c61e3db9da90847fbb8ffcdb5f3022696ac997", "Created": "2018-11-28T10:06:08.081429716Z", "Path": "java", "Args": [ "-Xmx1000m", "-jar", "/app/xxxx.jar" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 16567, "ExitCode": 0, "Error": "", "StartedAt": "2018-11-28T10:06:08.445847694Z", "FinishedAt": "0001-01-01T00:00:00Z", "Health": { "Status": "healthy", "FailingStreak": 0, "Log": [ { "Start": "2018-11-29T11:35:01.911518247+08:00", "End": "2018-11-29T11:35:02.064646904+08:00", "ExitCode": 0,......

现在需要获取容器的ip:

第一种方法:

# docker inspect 7a | jq -r ".[0].NetworkSettings.Networks.elk_elk.IPAddress"172.20.0.2

.[0] 取数组的第一个值,如下图,inspect返回的是一个字典的数组,.[0]就是取第一个元素,也就是整个返回值

后面的就是正常的json取值方式,简单

linux系统操作时,需要先yum安装jq来处理json数据

第二种方法:

# docker inspect 7a --format {{.NetworkSettings.Networks.elk_elk.IPAddress}}172.20.0.2

以下部分来自 https://yq.aliyun.com/articles/230067

Docker CLI 的 --format 参数提供了基于 Go模板 的日志格式化输出辅助功能,并提供了一些内置的增强函数。

Go语言提供了简单灵活的模板支持,而基于 Go 开发的 Docker 继承了该强大能力,使其可以脱离 Shell 的相关操作,直接对结果进行格式化输出。所有支持 --format 扩展的 Docker CLI 指令均支持该操作。

Go模板常用语法

注释格式: {{/注释内容/}}示例:

docker network inspect --format="{{/*查看容器的默认网关*/}}{{range .IPAM.Config}}{{.Gateway}}{{end}}" $INSTANCE_ID

变量系统变量 {{.}}点号表示当前对象及上下文,和 Java、C++ 中的 this 类似。可以直接通过{{.}}获取当前对象。

另外,如果返回结果也是一个 Struct 对象(Json 中以花括号/大括号包含),则可以直接通过点号级联调用,获取子对象的指定属性值。

示例代码:

#可以通过级联调用直接读取子对象 State 的 Status 属性,以获取容器的状态信息:docker inspect --format "{{/*读取容器状态*/}}{{.State.Status}}" $INSTANCE_ID

注意: 如果需要获取的属性名称包含点号(比如下列示例数据)或者以数字开头,则不能直接通过级联调用获取信息。因为属性名称中的点号会被解析成级联信息,进而导致返回错误结果。即便使用引号将其包含也会提示语法格式错误。此时,需要通过 index 来读取指定属性信息。

"Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" },

示例操作:

# 直接级联调用会提示找不到数据:docker inspect --format "{{.Options.com.docker.network.driver.mtu}}" bridge<no value># 用引号括起来会提示语法错误:docker inspect --format "{{.Options."com.docker.network.driver.mtu"}}" bridgeTemplate parsing error: template: :1: bad character U+0022 """# 正确的用法,必须用 index 读取指定属性名称的属性值:docker inspect --format "{{/*读取网络在hosts上的名称*/}}{{index .Options "com.docker.network.bridge.name"}}" bridgedocker0

自定义变量

可以在处理过程中设置自定义变量,然后结合自定义变量做更复杂的处理。 如果自定义变量的返回值是对象,则可以通过点号进一步级联访问其属性。比如 {{$Myvar.Field1}}。

示例操作:

# 结合变量的使用,对输出结果进行组装展现,以输出容器的所有绑定端口列表:docker inspect --format "{{/*通过变量组合展示容器绑定端口列表*/}}已绑定端口列表:{{println}}{{range $p,$conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{println}}{{end}}" Web_web_1# 示例输出信息已绑定端口列表:80/tcp -> 327708081/tcp -> 8081

遍历(循环):range

格式:

{{range pipeline}}{{.}}{{end}}{{range pipeline}}{{.}}{{else}}{{.}}{{end}}

range 用于遍历结构内返回值的所有数据。支持的类型包括 array, slice, map 和 channel。使用要点:

对应的值长度为 0 时,range 不会执行。结构内部如要使用外部的变量,需要在前面加 引用,比如Var2。range 也支持 else 操作。效果是:当返回值为空或长度为 0 时执行 else 内的内容。

示例操作:

# 查看容器网络下已挂载的所有容器名称,如果没有挂载任何容器,则输出 "With No Containers"docker inspect --format "{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}" bridgebrtestpeaceful_browntestdocker inspect --format "{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}" noneWith No Containers

索引: index

如果返回结果是一个 map, slice, array 或 string,则可以使用 index 加索引序号(从零开始计数)来读取属性值。

示例代码:

# docker inspect $INSTANCE_ID 查看容器绑定的端口信息,其 Config 属性就是一个 Map,包含了所有子网信息。... "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.31.254.1/24", "Gateway": "172.31.254.1" } ] }, ...

示例操作:

# 通过索引序号读取默认网关docker inspect bridge --format "{{/*查看网络的默认网关*/}}{{(index .IPAM.Config 0).Gateway}}"

判断:if … else … end

基本判断

not

返回单一参数的布尔否定值,即返回输入参数的否定值。

示例:

# 如果容器的 restarting 设置为 false,则返回信息“容器没有配置重启策略”docker inspect --format "{{if not .State.Restarting}}容器没有配置重启策略{{end}}" $(docker ps -q)

or

{{or x y}}: 表示如果 x 为真返回 x,否则返回 y。{{or x y z}}:后面跟多个参数时会逐一判断每个参数,并返回第一个非空的参数。如果都为 false,则返回最后一个参数。

除了 null(空)和 false 被识别为 false,其它值(字符串、数字、对象等)均被识别为 true。

示例:

docker inspect --format "{{or .State.Status .State.Restarting}}" $INSTANCE_ID

判断条件

判断语句通常需要结合判断条件一起使用,使用格式基本相同:

{{if 判断条件 .Var1 .Var2}}{{end}}go模板支持如下判断方式:eq: 相等,即 arg1 == arg2。比较特殊的是,它支持多个参数进行与比较,此时,它会将第一个参数和其余参数依次比较,返回下式的结果:{{if eq true .Var1 .Var2 .Var3}}{{end}}# 效果等同于:arg1==arg2 || arg1==arg3 || arg1==arg4 ...ne: 不等,即 arg1 != arg2。lt: 小于,即 arg1 < arg2。le: 小于等于,即 arg1 <= arg2。gt: 大于,即 arg1 > arg2。ge: 大于等于,即 arg1 >= arg2。

判断的使用

格式:

{{if pipeline}}{{end}}{{if pipeline}}{{else}}{{if pipeline}}{{end}}{{end}}{{if pipeline}}{{else if pipeline}}{{else}}{{end}}

示例操作:

# 输出所有已停止的容器名称:docker inspect --format "{{if ne 0.0 .State.ExitCode}}{{.Name}}{{end}}" $(docker ps -aq)docker inspect --format "{{if ne 0.0 .State.ExitCode}}{{.Name}}{{else}}该容器还在运行{{end}}" $(docker ps -aq)docker inspect --format "{{if ne 0.0 .State.ExitCode}}{{.Name}}{{else if .}}该容器还在运行{{end}}" $(docker ps -aq)# 输出所有已停止或配置了 Restarting 策略的容器名称docker inspect --format "{{if ne 0.0 .State.ExitCode}}{{.Name}}{{else if eq .State.Restarting true}}容器{{.Name}}配置了Restarting策略.{{else}}{{end}}" $(docker ps -aq)

打印信息

docker --format 默认调用 go语言的 print

函数对模板中的字符串进行输出。而 go语言还有另外 2 种相似的内置函数,对比说明如下:

print: 将传入的对象转换为字符串并写入到标准输出中。如果后跟多个参数,输出结果之间会自动填充空格进行分隔。

println: 功能和 print 类似,但会在结尾添加一个换行符。也可以直接使用 {{println}} 来换行。

printf: 与 shell 等环境一致,可配合占位符用于格式化输出。详细使用说明,可以参阅 go语言官方文档。

对比示例输出:

docker inspect --format "{{.State.Pid}}{{.State.ExitCode}}" $INSTANCE_ID 240390docker inspect --format "{{print .State.Pid .State.ExitCode}}" $INSTANCE_ID24039 0docker inspect --format "{{.State.Pid}}{{println " 从这换行"}}{{.State.ExitCode}}" $INSTANCE_ID 24039 从这换行0docker inspect --format "{{printf "Pid:%d ExitCode:%d" .State.Pid .State.ExitCode}}" $INSTANCE_IDPid:24039 ExitCode:0

管道

管道 即 pipeline ,与 shell 中类似,可以是上下文的变量输出,也可以是函数通过管道传递的返回值。

示例:

{{.Con | markdown | addlinks}}{{.Name | printf "%s"}}

内置函数 len

内置函数 len 返回相应对象的长度。

示例:

docker inspect --format "{{len .Name}}" $INSTANCE_ID

Docker 增强模板及函数

Docker 基于 go模板的基础上,构建了一些内置函数。下面逐一说明:

json

Docker 默认以字符串显示返回结果。而该函数可以将结果格式化为压缩后的 json 格式数据。

示例:

# 获取 Config 字段对应的 json 数据docker inspect --format="{{json .Config}}" $INSTANCE_ID

join

用指定的字符串将返回结果连接后一起展示。操作对象必须是字符串数组。

示例:

# 输出容器配置的所有 Entrypoint 参数,以 " , " 分隔:docker inspect --format "{{join .Config.Entrypoint " , "}}" $INSTANCE_ID

lower

将返回结果中的字母全部转换为小写。操作对象必须是字符串。

docker inspect --format "{{lower .Name}}" $INSTANCE_ID

upper

将返回结果中的字母全部转换为大写。操作对象必须是字符串。

docker inspect --format "{{upper .Name}}" $INSTANCE_ID

title

将返回结果的首字母转换为大写。操作对象必须是字符串,而且不能是纯数字。

docker inspect --format "{{title .State.Status}}" $INSTANCE_ID

split

使用指定分隔符将返回结果拆分为字符串列表。操作对象必须是字符串且不能是纯数字。同时,字符串中必须包含相应的分隔符,否则会直接忽略操作。

docker inspect --format "{{split .HostsPath "/"}}" $INSTANCE_ID