• Docker格式化输出命令:“docker inspect --format“


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

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

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

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

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

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

    示例代码:

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

    常用docker inspect --format 输出示例

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

    引文: 

    Docker格式化输出命令:"docker inspect --format" 学习笔记 - 散尽浮华 - 博客园

    https://www.jianshu.com/p/8e97ee55b086

  • 相关阅读:
    企业为啥邀请媒体做专访?有哪些注意事项?
    bootz 启动 kernel
    Promise从入门到精通(第3章 自定义(手写)Promise)
    mac vscode debug安装调试moodle
    ORACLE多列中取出数据最大的一条
    树洞外链网盘系统php源码去除底部版权优化版
    27寸2K显示器 - HKC G27H2
    Linux定时任务切割日志
    消息服务MNS之初见
    简单易懂的时序数据压缩算法分析
  • 原文地址:https://blog.csdn.net/qq_15371293/article/details/126304145