docker inspect --format 详解

article/2025/10/25 18:50:01

docker inspect --format

文章目录

  • docker inspect --format
    • 1. 什么是模板
    • 2. Go模板语法
    • 3. 变量
      • 3.1 系统变量 {{.}}
      • 3.2 自定义变量
      • 3.3 遍历(循环):range
    • 4. index
    • 5. 判断
      • 5.1 not
      • 5.2 or
      • 5.3 判断条件
      • 5.4 判断示例
    • 6. 打印信息
    • 9. 管道
    • 10. 内置函数 len
    • 11. Docker 增强模板及函数
      • 11.1 json
      • 11.2 join
      • 11.3 lower
      • 11.4 upper
      • 11.5 title
      • 11.6 split

“大家好,我是幽灵代笔,这篇文章主要介绍Docker inspect -f(--format) 命令的实战应用,docker --format其实是提供了基于 Go模板 的日志格式化输出辅助功能,并提供了一些内置的增强函数,这篇文章原文来自博客园 散尽浮华 博主,再次基础上增添了命令场景应用案例。”

在这里插入图片描述

1. 什么是模板

上图是大家熟悉的 MVC 框架(Model View Controller): Model(模型,通常在服务端)用于处理数据、View(视图,客户端代码)用于展现结果、Controller(控制器)用于控制数据流,确保 M 和 V 的同步,即一旦 M 改变,V 也应该同步更新。
而对于 View 端的处理,在很多动态语言中是通过在静态 HTML 代码中插入动态数据来实现的。例如 JSP 的 <%=....=%> 和 PHP 的 <?php.....?> 语法。

由于最终展示给用户的信息大部分是静态不变的,只有少部分数据会根据用户的不同而动态生成。比如,对于 docker ls 的输出信息会根据附加参数的不同而不同,但其表头信息是固定的。所以,将静态信息固化为模板可以复用代码,提高展示效率。

2. Go模板语法

格式: {{/*注释内容*/}}

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

3. 变量

3.1 系统变量 {{.}}

点号表示当前对象及上下文,和 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"}}' bridge
Template parsing error: template: :1: bad character U+0022 '"'# 正确的用法,必须用 index 读取指定属性名称的属性值:
$ docker inspect --format '{{/*读取网络在hosts上的名称*/}}{{index .Options "com.docker.network.bridge.name"}}' bridge
docker0

实例:

  1. 获取容器ID
$  docker inspect -f '{{.Id}}' prometheus 
9094fdeb64edf75d52189e1b985d0926cf4e6d53880a8f09ab30fc2d6c8a0908
  1. 获取容器Name
$ docker inspect --format='{{.Name}}' cadvisor
/cadvisor$ docker inspect --format='{{.Name}}' cadvisor |cut -d"/" -f2
cadvisor$ docker inspect --format='{{.Name}}' $(docker ps -aq)  |cut -d"/" -f2
cadvisor
node_exporter
qingscan
mysqlser
  1. 获取容器Hostname
$ docker inspect --format '{{ .Config.Hostname }}' cadvisor
681a3c5206b1
  1. 获取容器镜像名字
$ docker inspect --format='{{.Config.Image}}' cadvisor
google/cadvisor:latest
  1. 获取容器状态
$ docker inspect -f '{{.State.Status}}' prometheus 
running$ docker inspect -f '{{"status:"}}{{.State.Status}}' prometheus 
status:running$ docker inspect -f '{{"status:"}}{{index .State.Status}}' prometheus 
status:running
  1. 获取容器的log path
$ docker inspect --format='{{.LogPath}}' `docker ps -a -q`
/data/docker/containers/681a3c5206b106463a3f4f65a2c44e6ecfe14ff0bc22ee76a153ebdf5e3d4084/681a3c5206b106463a3f4f65a2c44e6ecfe14ff0bc22ee76a153ebdf5e3d4084-json.log
/data/docker/containers/ac80df13976f7cb17ce54768adafdea14a6845c0f7d127b7d146adf52c50c788/ac80df13976f7cb17ce54768adafdea14a6845c0f7d127b7d146adf52c50c788-json.log
/data/docker/containers/6cac92ad7938c33f67f94524ca27caa7c670cb9a19871dcab7af8c6435b557d4/6cac92ad7938c33f67f94524ca27caa7c670cb9a19871dcab7af8c6435b557d4-json.log
/data/docker/containers/e311bdc95cf25fa80962a86e8047b60ec09eabb9db02cbdfa51efd444b3382d2/e311bdc95cf25fa80962a86e8047b60ec09eabb9db02cbdfa51efd444b3382d2-json.log

3.2 自定义变量

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

# 结合变量的使用,对输出结果进行组装展现,以输出容器的所有绑定端口列表:
$ 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

3.3 遍历(循环):range

格式:

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

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

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

查看容器网络下已挂载的所有容器名称,如果没有挂载任何容器,则输出 “With No Containers

"NetworkSettings": {"Bridge": "","SandboxID": "a4ae52dfb055599b4b582d4c91f5a38d297bbed30f3e1d698f1c199be572c1e3","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"9090/tcp": [{"HostIp": "0.0.0.0","HostPort": "9090"}]},"SandboxKey": "/var/run/docker/netns/a4ae52dfb055","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "16dbaea3aef149379a83673284c9adb843dab363246e6eb3255e40b149003580","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "2045baaf0ce3f404298a1a57035b6cc6c91ebd4ee05ce219b818f255c198b44b","EndpointID": "16dbaea3aef149379a83673284c9adb843dab363246e6eb3255e40b149003580","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02"}}}}
]

实例

  1. 获取容器IP地址
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' prometheus
172.17.0.2$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)
172.17.0.3
172.17.0.2
  1. 获取容器端口映射
$ docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' prometheus9090/tcp -> 9090 
  1. 获取容器MacAddress
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $(docker ps -a -q)
02:42:ac:11:00:03
02:42:ac:11:00:02
02:42:ac:14:00:02
  1. 获取Hostname Name IP
$ docker inspect --format 'Hostname:{{ .Config.Hostname }}  Name:{{.Name}} IP:{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)
Hostname:681a3c5206b1  Name:/cadvisor IP:172.17.0.3
Hostname:ac80df13976f  Name:/node_exporter IP:172.17.0.2

4. index

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

$ docker inspect --format='{{(index (index .NetworkSettings.Ports "9090/tcp") 0).HostPort}}'  prometheus
9090

5. 判断

5.1 not

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

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

5.2 or

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

示例:

$ docker inspect --format '{{or .State.Status .State.Restarting}}' $(docker ps -q)
running

5.3 判断条件

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

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

go模板支持如下判断方式:

  1. eq: 相等,即 arg1 == arg2。比较特殊的是,它支持多个参数进行与比较,此时,它会将第一个参数和其余参数依次比较,返回下式的结果:
{{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。

5.4 判断示例

{{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)

6. 打印信息

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

  • print: 将传入的对象转换为字符串并写入到标准输出中。如果后跟多个参数,输出结果之间会自动填充空格进行分隔。
  • println: 功能和 print 类似,但会在结尾添加一个换行符。也可以直接使用 {{println}} 来换行。
  • printf: 与 shell 等环境一致,可配合占位符用于格式化输出。
$ 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

9. 管道

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

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

10. 内置函数 len

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

$ docker inspect --format '{{len .Name}}' prometheus 
11

11. Docker 增强模板及函数

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

11.1 json

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

$ docker inspect nginx -f '{{json .State}}' | jq
{"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 23773,"ExitCode": 0,"Error": "","StartedAt": "2021-08-04T09:27:06.018089509Z","FinishedAt": "0001-01-01T00:00:00Z"
}

11.2 join

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

# 查看容器的Entrypoint命令
$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                              COMMAND                                                                                                                                           CREATED      STATUS      PORTS                                       NAMES
681a3c5206b106463a3f4f65a2c44e6ecfe14ff0bc22ee76a153ebdf5e3d4084   google/cadvisor:latest             "/usr/bin/cadvisor -logtostderr"                                                                                                                  9 days ago   Up 9 days   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   cadvisor# 输出容器配置的所有 Entrypoint 参数,以 " , " 分隔:
$ docker inspect --format '{{join .Config.Entrypoint ","}}' cadvisor 
/usr/bin/cadvisor,-logtostderr$ docker inspect --format '{{join .Config.Entrypoint " "}}' cadvisor 
/usr/bin/cadvisor -logtostderr

11.3 lower

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

$ docker inspect --format "{{lower .Name}}" cadvisor 
/cadvisor

11.4 upper

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

$ docker inspect --format "{{upper .Name}}" cadvisor 
/CADVISOR

11.5 title

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

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

11.6 split

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

$ docker inspect --format '{{split .HostsPath "/"}}' cadvisor 
[ data docker containers 681a3c5206b106463a3f4f65a2c44e6ecfe14ff0bc22ee76a153ebdf5e3d4084 hosts]

“谢谢坚持看能到最后,由于本人能力水平有限,文章或许存在错误、不足,希望大家可以后台留言。最后,本公众号文章的梳理归纳主要目的不仅仅是与大家一起成长、积累知识,而且还有应急之需便于查询。如果觉得对你有帮助,记得收藏,日后为自己的知识库迭代统一归纳,收获会更大奥。”

参考:

  • What to Inspect When You’re Inspecting
  • Docker格式化输出命令:“docker inspect --format” 学习笔记

http://chatgpt.dhexx.cn/article/uO9TJ92k.shtml

相关文章

android studio inspect code,Android Studio使用inspect code删除 unused import

项目经常需要从别的项目复制一些文件过来&#xff0c;但是经常出现大片的导包unused import&#xff0c;但是我用自动导包并没有效果&#xff0c;必须把这些错误的导包手动删除才可以导入正确的包&#xff0c;虽然文件不多&#xff0c;手动删除是可以完成的&#xff0c;但是作为…

Halcon Variable Inspect 安装失败

这里写自定义目录标题 Halcon Variable Inspect 安装失败 Halcon Variable Inspect 安装失败 在 Visual Studio 2022 环境下安装 HALCON2105ProgressVariableInspect.vsix 失败。 点击 “View Install Log” 查看日志。 主要问题在运行vsix文件时&#xff0c;它会监控然后运行…

docker inspect 查看部分数据

1. 问题描述 使用docker inspect命令可查看 docker 镜像/容器/数据卷 等的具体配置docker inspect命令格式docker inspect [参数] 容器名/容器ID/镜像名/镜像ID/数据卷名...如果不加参数&#xff0c;则输出很多&#xff0c;难以精确查看真正关心的内容 如果使用grep 表达式&am…

【网络教程】如何安装inspect.exe

文章目录 安装 安装 Inspect&#xff08;Inspect.exe&#xff09;是一个基于Windows的工具&#xff0c;允许您选择任何UI元素并查看元素的可访问性数据。您可以查看Microsoft UI自动化属性和控制模式&#xff0c;以及Microsoft活动辅助功能属性。Inspect还允许您测试UI自动化树…

inspect.exe安装使用

官网下载 https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/ 官网教程 https://learn.microsoft.com/zh-cn/windows/win32/winauto/inspect-objects 要求 系统要求 Windows SDK 具有以下最低系统要求&#xff1a; 支持的操作系统 Windows 10版本 150…

python中inspect模块用法详解

获取函数签名对象。函数签名包含了一个函数的信息&#xff0c;包括函数名、它的参数类型、它所在的类和名称空间及其他信息&#xff09;。 inspect模块主要提供了四种用处&#xff1a; 对是否是模块、框架、函数进行类型检查获取源码获取类或者函数的参数信息解析堆栈 1、对…

docker inspect

docker inspect 命令用于获取有关 Docker 容器、镜像、网络等的详细信息。它提供了关于指定对象的元数据和配置的完整视图&#xff0c;包括运行状态、网络设置、卷挂载、环境变量等。 以下是一些常见的字段和属性&#xff0c;可以根据需要选择其中一些或全部列出&#xff1a; …

UI自动化辅助工具Inspect

了解更多访问&#xff1a;windows应用程序GUI自动化控制 Inspect&#xff08;Inspect.exe&#xff09;是一个基于Windows的工具&#xff0c;允许您选择任何UI元素并查看元素的可访问性数据。您可以查看Microsoft UI自动化属性和控制模式&#xff0c;以及Microsoft活动辅助功能…

mysql数据库基础管理--数据库权限表

mysql数据库通过权限表实现对mysql数据库的访问&#xff0c;权限表存放在mysql数据库中&#xff0c;有脚本 mysql_install_db初始化。 存储账户权限表主要 USER,DB,HOST,TABLES_PRIV,COLUMNS_PRIV和PROCS_PRIV. mysql.USER 记录允许连接到数据库的用户信息&#xff0c;里面…

1、user权限表详解

MySQL 在安装时会自动创建一个名为 mysql 的数据库&#xff0c;mysql 数据库中存储的都是用户权限表。用户登录以后&#xff0c;MySQL 会根据这些权限表的内容为每个用户赋予相应的权限。 user 表是 MySQL 中最重要的一个权限表&#xff0c;用来记录允许连接到服务器的账号信息…

MySQL中用户权限、库权限、表权限的控制

MySQL中用户权限、库权限、表权限的控制 在开发中&#xff0c;除了可以在脚本代码中控制开发者对MySQL数据库数据表的权限&#xff0c;还可以在mysql层面进行控制。 对mysql的权限的控制可以大致分为三个层面&#xff1a;①连接上允不允许&#xff08;是否能登录到mysql服务器…

数据库表设计1:用户权限管理

前言&#xff1a;权限管理是所有后台系统的都会涉及的一个重要组成部分&#xff0c;主要目的是对不同用户访问资源进行权限的控制&#xff0c;避免因权限控制缺失或操作不当引发的风险问题&#xff0c;如操作错误&#xff0c;隐私数据泄露等问题。 1、RBAC简介 RBAC&#xff0…

用户、角色、权限表的关系(mysql)

一&#xff0c;各个表格 1、用户表 CREATE TABLE t_user ( id varchar(40) NOT NULL, username varchar(20) NOT NULL, PRIMARY KEY (id) ) 2、角色表 CREATE TABLE t_role ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL, description varchar(255) DEFAUL…

MySQL 权限管理表设计

阅读目录 MySQL 权限管理表设计创建三张主表三张表添加数据创建两张关系表两张表添加数据关联查询1 查询刘德华的角色2 查询苹果游客这个角色对应的用户是谁?3 查询总管理员的权限有哪些?4 查询苹果浏览权限对应的角色有哪些?5 查询刘德华的权限有哪些?6 查询杨幂的权限有哪…

权限管理数据表设计

权限管理数据表的设计 需要五张表&#xff0c;分别为&#xff08;此处以MySQL为例&#xff09; 用户表 t_user 角色表t_role权限表t_permission用户角色表t_user_rolet角色权限表t_role_permission 用户拥有什么角色&#xff0c;这个角色拥有什么权限 用户表&#xff08;t_u…

用户权限设置5张表

--权限表&#xff08;资源和权限合并&#xff09; CREATE TABLE sys_permission ( id number(20) PRIMARY KEY NOT NULL,-- COMMENT 主键, name varchar2(128) NOT NULL , --COMMENT 资源名称, type varchar2(32) NOT NULL, -- COMMENT 资源类型&#xff1a;men…

MySQL权限表

一、权限系统概述 安装MySQL时自动安装一个名为mysql的数据库。mysql数据库下面存储的都是权限表。 用户登录以后&#xff0c;MySQL数据库系统会根据这些权限表的内容为每个用户赋予相应的权限。这些权限表中最重要的是user表、db表和host表&#xff0c;除此之外&#xff0c;还…

权限管理用到的表

前言&#xff1a; 一个成熟的系统系统是离不开权限管理的&#xff0c;说权限管理就必须要说下权限管理经典的五张表了&#xff0c;无论是自定义的权限管理框架&#xff0c;还是流行的Shiro、SpringSecurity等权限管理框架都是离不开这五张表的&#xff0c;哪五张表呢&#xff0…

表设计之权限管理

分析 权限管理需要设计三张主表和两张关系表主表包括:用户表,角色表,权限表关系表:用户-角色关系表,角色权限关系表 建表准备数据 创建三张主表: 用户表, 角色表,权限表 create table user(id int primary key auto_increment, name varchar(20));create table role(id int p…

表设计----用户表,角色表,权限表

基于角色的访问控制&#xff1a;&#xff08;java Web 编程口诀&#xff09; 用户表角色表&#xff0c;用户角色中间表。 角色表权限表&#xff0c;角色权限中间表。 一个用户可有多个角色&#xff0c;一个角色又可有多个权限。这就是用户-角色-权限授权的模型。 为何不直接让…