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

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模板常用语法
注释
格式: { {/*注释内容*/}}
示例:

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 

扫描二维码关注公众号,回复: 15499569 查看本文章

常用docker inspect --format 输出示例

[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
docker inspect --format='{
   
   {.Name}}' $(docker ps -aq)


docker inspect --format='{
   
   {range .NetworkSettings.Networks}}{
   
   {.IPAddress}}{
   
   {end}}' $(docker ps -q)

引文: 

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

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

猜你喜欢

转载自blog.csdn.net/qq_15371293/article/details/126304145