首页 > 其他分享 >(转)Docker格式化输出命令:"docker inspect --format" 学习笔记

(转)Docker格式化输出命令:"docker inspect --format" 学习笔记

时间:2023-07-11 09:04:28浏览次数:37  
标签:end Name format -- inspect docker

原文:https://www.cnblogs.com/kevingrace/p/6424476.html

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

什么是模板?
上图是大家熟悉的 MVC 框架(Model View Controller): Model(模型,通常在服务端)用于处理数据、View(视图,客户端代码)用于展现结果、Controller(控制器)用于控制数据流,确保 M 和 V 的同步,即一旦 M 改变,V 也应该同步更新。
而对于 View 端的处理,在很多动态语言中是通过在静态 HTML 代码中插入动态数据来实现的。例如 JSP 的 <%=....=%> 和 PHP 的 <?php.....?> 语法。
由于最终展示给用户的信息大部分是静态不变的,只有少部分数据会根据用户的不同而动态生成。比如,对于 docker ls 的输出信息会根据附加参数的不同而不同,但其表头信息是固定的。所以,将静态信息固化为模板可以复用代码,提高展示效率。

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

Go模板常用语法
注释
格式: {{/*注释内容*/}}
示例:

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

变量
系统变量 {{.}}
点号表示当前对象及上下文,和 Java、C++ 中的 this 类似。可以直接通过{{.}}获取当前对象。
另外,如果返回结果也是一个 Struct 对象(Json 中以花括号/大括号包含),则可以直接通过点号级联调用,获取子对象的指定属性值。

示例代码:

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

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

1 2 3 4 5 6 7 8 "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"         },

示例操作:

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

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

示例操作:

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

遍历(循环):range
格式:

1 2 {{range pipeline}}{{.}}{{end}} {{range pipeline}}{{.}}{{else}}{{.}}{{end}}

range 用于遍历结构内返回值的所有数据。支持的类型包括 array, slice, map 和 channel。使用要点:
-  对应的值长度为 0 时,range 不会执行。
-  结构内部如要使用外部的变量,需要在前面加 引用,比如Var2。
-  range 也支持 else 操作。效果是:当返回值为空或长度为 0 时执行 else 内的内容。

示例操作:

1 2 3 4 5 6 7 8 # 查看容器网络下已挂载的所有容器名称,如果没有挂载任何容器,则输出 "With No Containers" docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' bridge brtest peaceful_brown test   docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' none With No Containers

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

示例代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 # docker inspect $INSTANCE_ID 查看容器绑定的端口信息,其 Config 属性就是一个 Map,包含了所有子网信息。 ...  "IPAM": {             "Driver""default",             "Options": null,             "Config": [                 {                     "Subnet""172.31.254.1/24",                     "Gateway""172.31.254.1"                 }             ]         },            ...

示例操作:

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

判断:if … else … end
基本判断
1)  not
   返回单一参数的布尔否定值,即返回输入参数的否定值。

示例:

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

2) or
-   {{or x y}}: 表示如果 x 为真返回 x,否则返回 y。
-   {{or x y z}}:后面跟多个参数时会逐一判断每个参数,并返回第一个非空的参数。如果都为 false,则返回最后一个参数。
-  除了 null(空)和 false 被识别为 false,其它值(字符串、数字、对象等)均被识别为 true。

示例:

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

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

1 {{if 判断条件 .Var1 .Var2}}{{end}}

go模板支持如下判断方式:
1)  eq: 相等,即 arg1 == arg2。比较特殊的是,它支持多个参数进行与比较,此时,它会将第一个参数和其余参数依次比较,返回下式的结果:

1 2 3 {{if eq true .Var1 .Var2 .Var3}}{{end}} # 效果等同于: arg1==arg2 || arg1==arg3 || arg1==arg4 ...

2) ne: 不等,即 arg1 != arg2。
3) lt: 小于,即 arg1 < arg2。
4) le: 小于等于,即 arg1 <= arg2。
5) gt: 大于,即 arg1 > arg2。
6) ge: 大于等于,即 arg1 >= arg2。

判断的使用
格式:

1 2 3 {{if pipeline}}{{end}} {{if pipeline}}{{else}}{{if pipeline}}{{end}}{{end}} {{if pipeline}}{{else if pipeline}}{{else}}{{end}}

示例:

1 2 3 4 5 6 7 # 输出所有已停止的容器名称: 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 等环境一致,可配合占位符用于格式化输出。

对比示例输出:

1 2 3 4 5 6 7 8 9 10 11 12 docker inspect --format '{{.State.Pid}}{{.State.ExitCode}}' $INSTANCE_ID 240390   docker inspect --format '{{print .State.Pid .State.ExitCode}}' $INSTANCE_ID 24039 0   docker inspect --format '{{.State.Pid}}{{println " 从这换行"}}{{.State.ExitCode}}' $INSTANCE_ID 24039 从这换行 0   docker inspect --format '{{printf "Pid:%d ExitCode:%d" .State.Pid .State.ExitCode}}' $INSTANCE_ID Pid:24039 ExitCode:0

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

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

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

1 docker inspect --format '{{len .Name}}' $INSTANCE_ID

Docker 增强模板及函数
Docker 基于 go模板的基础上,构建了一些内置函数。

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

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

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

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

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

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

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

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

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

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

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

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

============================常用docker inspect --format 输出示例========================

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 [root@node1 ~]# docker ps CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS               NAMES 2ed603e52896        172.16.60.214:5000/kevin_nginx   "/bin/sh -c '/usr/..."   13 minutes ago      Up 13 minutes                           docker-test111 24e6607534f1        172.16.60.214:5000/kevin_nginx   "/bin/sh -c '/usr/..."   13 minutes ago      Up 13 minutes                           docker-test11 19be6b264b6e        172.16.60.214:5000/kevin_nginx   "/bin/sh -c '/usr/..."   13 minutes ago      Up 13 minutes                           docker-test1    1) 获取容器的IP (后面使用容器名或容器ID都可以) [root@node1 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q) 192.10.160.193 173.20.19.128 17.16.10.128    [root@node1 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-test1 17.16.10.128    2) 获取容器的MAC地址 [root@node1 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $(docker ps -a -q) ee:ee:ee:ee:ee:ee ee:ee:ee:ee:ee:ee ee:ee:ee:ee:ee:ee    [root@node1 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' docker-test1 ee:ee:ee:ee:ee:ee    3) 获取容器Name [root@node1 ~]# docker inspect --format='{{.Name}}' $(docker ps -aq) /docker-test111 /docker-test11 /docker-test1 /calico-node    [root@node1 ~]# docker inspect --format='{{.Name}}' $(docker ps -aq)|cut -d"/" -f2 docker-test111 docker-test11 docker-test1    [root@node1 ~]# docker inspect --format='{{.Name}}' docker-test1 /docker-test1    [root@node1 ~]# docker inspect --format='{{.Name}}' docker-test1|cut -d"/" -f2 docker-test1    4) 获取容器Hostname [root@node1 ~]# docker inspect --format '{{ .Config.Hostname }}' $(docker ps -q) 2ed603e52896 24e6607534f1 19be6b264b6e    [root@node1 ~]# docker inspect --format '{{ .Config.Hostname }}' docker-test1 19be6b264b6e    5) Hostname Name IP [root@node1 ~]# docker inspect --format 'Hostname:{{ .Config.Hostname }}  Name:{{.Name}} IP:{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q) Hostname:2ed603e52896  Name:/docker-test111 IP:192.10.160.193 Hostname:24e6607534f1  Name:/docker-test11 IP:173.20.19.128 Hostname:19be6b264b6e  Name:/docker-test1 IP:17.16.10.128    [root@node1 ~]# docker inspect --format 'Hostname:{{ .Config.Hostname }}  Name:{{.Name}} IP:{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-test1 Hostname:19be6b264b6e  Name:/docker-test1 IP:17.16.10.128    6) 获取容器的log path [root@node1 ~]# docker inspect --format='{{.LogPath}}' `docker ps -a -q` [root@node1 ~]# docker inspect --format='{{.LogPath}}' docker-test1    7) 获取容器的image镜像名称 [root@node1 ~]# docker inspect --format='{{.Config.Image}}' `docker ps -a -q` 172.16.60.214:5000/kevin_nginx 172.16.60.214:5000/kevin_nginx 172.16.60.214:5000/kevin_nginx quay.io/calico/node:v2.6.10 [root@node1 ~]# docker inspect --format='{{.Config.Image}}' docker-test1 172.16.60.214:5000/kevin_nginx    8) 获取容器绑定的端口(port bindings) [root@node1 ~]# docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' `docker ps -a -q` [root@node1 ~]# docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' docker-test1   9) 获取service实例的Ip [root@swarm-manager-node ~]# docker service ps my-test  ID                    NAME       IMAGE                                                   NODE                         DESIRED   STATE  CURRENT STATE    ERROR  PORTS t71gqufekv2o  my-test.1  172.16.60.214:5000/kevin_nginx:latest  swarm-node2              Running    Running 16 seconds ago         9cuq2yf10d60 my-test.2  172.16.60.214:5000/kevin_nginx:latest  swarm-manager-node  Running   Running 16 seconds ago         srt2yo817kpv  my-test.3  172.16.60.214:5000/kevin_nginx:latest  swarm-node1               Running    Running 16 seconds ago     [root@swarm-manager-node ~]# docker inspect ` docker service ps my-test -q` --format '{{range .NetworksAttachments}}{{.Addresses}}{{end}}' | cut -d '[' -f2|cut -d ']' -f1 10.255.0.7/16 10.255.0.8/16 10.255.0.9/16   10) 获取service示例的container ID  (获取的是ID的全称,一般只要取ID前面12个字符就可以了) [root@swarm-manager-node ~]# docker inspect ` docker service ps my-test -q` --format '{{ .Status.ContainerStatus.ContainerID }}' c6c18a74a465163757fe928fec9e633223200f92d1c59e5d2d77eabfaa5ae93a 5f558bb014ea3d3eef5c8d4bd70e2e3048d7fc6725538303be960ac658d93b32 dde578bf60190a63ed5c8c4a9f5a3044566a159e8debe8717342e263c6199f26

标签:end,Name,format,--,inspect,docker
From: https://www.cnblogs.com/liujiacai/p/17542820.html

相关文章

  • transformer
    arXiv:1706.037621.问题提出全连接神经网络(FCN),可以很好的处理输入为1个向量(特征向量)的情况,但是如果输入是一组向量,FCN处理起来不太方便以词性标记的问题为例对于处于同一个句子中的相同的2个单词saw,词性不同,前者为动词(V),后者为名词(N)如果尝试使用FCN去解决这个问题,将每个单......
  • 4.10 x64dbg 反汇编功能的封装
    LyScript插件提供的反汇编系列函数虽然能够实现基本的反汇编功能,但在实际使用中,可能会遇到一些更为复杂的需求,此时就需要根据自身需要进行二次开发,以实现更加高级的功能。本章将继续深入探索反汇编功能,并将介绍如何实现反汇编代码的检索、获取上下一条代码等功能。这些功能对于分......
  • 高等数学——无穷小的比较
    无穷小的比较趋于\(0\)的速度快慢。定义如果\(\lim\frac{\beta}{\alpha}=0\),那么就说\(\beta\)是比\(\alpha\)高阶的无穷小,记作\(\beta=o(\alpha)\)。如果\(\lim\frac{\beta}{\alpha}=\infty\),那么就说\(\beta\)是比\(\alpha\)低阶的无穷小。如果\(\lim......
  • 二中集训游寄
    Day0书接上回休业式,退役寄。upd:复活了。Day1(7.4)模拟赛,\(100+10+20+20=150\),总共\(45\)位巨佬,我\(10/46\),单调队列了\(35\)人,好耶!今天比较符合NOIP2022,老师说1=线120左右,我1=了?!今天没有数据结构,好耶!这次似乎不止QZ的,还有CX、YW的,有新高二,有新高一,有新初三......
  • 达梦实时主备搭建技术分享
    在部分工作场景下可能会使用到达梦数据库的数据守护功能,本文介绍达梦数据守护服务的搭建。此次搭建使用三台机器,一主一备一监视器。其中主备数据库需要提前初始化。一、数据准备需要保证主备库数据一直,这里使用dmrman脱机备份还原方式进行。停止主库,进行rman全备。./dmrmanCTL......
  • 4.9 x64dbg 内存处理与差异对比
    LyScript插件中针对内存读写函数的封装功能并不多,只提供了最基本的内存读取和内存写入系列函数的封装,本章将继续对API接口进行封装,实现一些在软件逆向分析中非常实用的功能,例如ShellCode代码写出与置入,内存交换,内存区域对比,磁盘与内存镜像比较,内存特征码检索等功能,学会使用这些功......
  • pycharm安装django失败,原因是报了一个ssl异常,也就是说和国外源站服务器ssl失败。 所
    pycharm安装django失败,原因是报了一个ssl异常,也就是说和国外源站服务器ssl失败。所以选用国内源站安装:选中Options,输入:“-ihttps://pypi.tuna.tsinghua.edu.cn/simple” ......
  • 如何使用Java在Excel中实现一个数据透视表
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微信、淘宝这些APP好像都喜欢出这种记录使用......
  • 第二节 贪心
    引入贪心算法(英语:greedyalgorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响。可想而知,并不是所有的时候贪心法都能获得最优解,所以一般使用贪心法的时候......
  • SQ工具|6|图斑分割按比例分配面积(数值)
    问题:在一个图斑进行分割后,需将此图斑的某个属性按照分割后的图形面积比例进行分配赋值.比如一个图形面积5657.76,图斑面积5630.25,在分割此图斑后,需要按照分割后的比例对图斑地类面积5630.25进行平均分配 界面如图所示,按找要求分别选择分割前图层与分割后图层,值字段是要参与分......