【Linux】Docker洞察:掌握docker inspect命令与Go模板技巧
👨🎓博主简介
🏅CSDN博客专家
🏅云计算领域优质创作者
🏅华为云开发者社区专家博主
🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗
文章目录
-
- 0️⃣ 前言
-
- ① `docker inspect` 是做什么的?
- ② 为什么要用 Go template ?
- 1️⃣ 基本语法
- 2️⃣ JSON → Go template 翻译法
-
- 📌 原始 JSON(随便选了几个参数作为参考)
- ✅ 基础:嵌套对象用点号
-
- ✅ 进阶:数组 / map[键值对集合] 用 `index` 或 `range`
- ✅ 高级:辅助函数
- ✅ 最终:组合成命令
- 3️⃣ 常用速查表
- 4️⃣ 口诀速记
0️⃣ 前言
① docker inspect
是做什么的?
答:
docker inspect
是用来查看容器/镜像/卷/网络等详细 JSON 配置的命令,比如可以查找容器的映射路径、端口、网络模式、重启模式等等;
docker inspect
参数:
-f, --format
docker inspect -f \'{{.NetworkSettings.IPAddress}}\' nginx
--type
docker inspect --type=image nginx
-s, --size
docker inspect -s my_container
常用参数:
-f
(或--format
)是 Go template 的格式化参数,允许你只提取需要的字段,避免在一大坨 JSON 里人肉搜索,非常好用。
② 为什么要用 Go template ?
docker inspect
输出的是整坨 JSON(几百行,看着比较繁琐),而我们只想拿其中的 1~2 个字段。
- 如果每次都用
jq
/grep
/awk
,脚本里要多装一个二进制,还是比较麻烦的; Go template
直接内建在 Docker CLI 里,零依赖、跨平台、一条命令搞定。
本期我们主要讲解 docker inspect -f 的使用。
1️⃣ 基本语法
docker inspect -f \'\' <对象>
可以是:容器名、容器 ID、镜像名/ID、卷名、网络名等等,常用的就是容器名或容器id。
用 Go text/template 语法,字段路径以 点号 分隔。
那么问题来了,我要怎么知道自己想要的数据是要用哪个Go语法
呢?接下来我们讲解json
如何翻译成go
语法。
2️⃣ JSON → Go template 翻译法
📌 原始 JSON(随便选了几个参数作为参考)
[ { \"Id\": \"59c88ce44ce023f......\", \"Created\": \"2025-07-22T03:15:24.968351115Z\", \"Path\": \"bash\", \"Args\": [], \"State\": { \"Status\": \"running\", \"Pid\": 16698, \"StartedAt\": \"2025-07-22T03:15:26.473607152Z\", }, \"Name\": \"/my_nginx\", \"HostConfig\": { \"Binds\": [ \"/home/lcy/nginx/conf/:/usr/local/nginx/conf/\", \"/home/lcy/nginx/html/:/application/nginx/html/\", \"/home/lcy/nginx/logs/:/application/nginx/logs/\", \"/etc/localtime:/etc/localtime/\" ], \"NetworkSettings\": { \"IPAddress\": \"172.17.0.2\" }, \"Mounts\": [ { \"Type\": \"bind\", \"Source\": \"/home/lcy/nginx/conf/\", \"Destination\": \"/usr/local/nginx/conf/\" } { \"Type\": \"bind\", \"Source\": \"/home/lcy/nginx/logs/\", \"Destination\": \"/usr/local/nginx/logs/\" } ], \"Config\": { \"Env\": [\"PATH=/usr/bin\", \"FOO=bar\"] } }]
✅ 基础:嵌套对象用点号
我们看json其实就类似与键值对那种,比如\"Id\": \"59c88ce44ce023f......\"
,我们就可以找到键Id
,然后给他转成Go模板的时候就可以变成{{.Id}}
,这样docker inspect -f \'{{.Id}}\' nginx
的时候就可以输出Id
的值了。
拆分
{{.Id}}
解析:以.
作为分割,Id
为要查找内容的键,加上{{}}
,{{ }}
是 Go 模板语法里的“占位符”,告诉 Docker:“把这里换成真正的值”。
如果是如下多行json嵌套内容:
\"NetworkSettings\": { \"IPAddress\": \"172.17.0.2\" },
那这样就变成了两层,也就是说要把这两个键都输入才能查到,如果只输入最外面这层的键是拿不到数据的:{{.NetworkSettings.IPAddress}}
,如果是三层或者四层,以此类推就行,具体可查看如下JSON → Go 模板 的映射规则。
- JSON → Go 模板 的映射规则
\"Name\": \"/my_c\"
{{.Name}}
\"State\": {\"Status\": \"running\"}
{{.State.Status}}
\"NetworkSettings\": {\"Networks\": {\"bridge\": {\"IPAddress\": \"172..\"}}}
{{.NetworkSettings.Networks.bridge.IPAddress}}
\"Env\": [\"PATH=...\", \"FOO=bar\"]
{{index .Env 1}}
index
\"Mounts\": [{ \"Source\": \"/home/...}{ \"Source\": \"/home/...}]
{{range .Mounts}}{{.Source}}{{end}}
range
\"Mounts\": [{...}]
{{json .Config.Labels}}
json
\"HostConfig\": { \"Binds\": [ \"/home...:/usr/...\"]
{{join .HostConfig.Binds \" \"}}
join “ ”
无
{{printf \"%.2fMB\" .SizeRw}}
printf
\"Name\": \"/nginx\"
{{lower .Name}}
{{upper .Name}}
lower
转大写
upper
以下为简单的几种转换:
\"Id\": \"59c88ce44ce023f......\"
{{.Id}}
\"Created\": \"2025-07-22T03:15:24.968351115Z\"
{{.Created}}
\"State\": { \"Status\": \"running\" }
{{.State.Status}}
\"NetworkSettings\": { \"IPAddress\": \"172.17.0.2\" }
{{.NetworkSettings.IPAddress}}
✅ 进阶:数组 / map[键值对集合] 用 index
或 range
数组
\"HostConfig\": { \"Binds\": [ \"/home...:/usr/...\"]
{{.HostConfig.Binds}}
取第一个值:
{{index .HostConfig.Binds 0}}
数组
\"Env\": [\"PATH=...\", \"FOO=bar\"]
{{index .Config.Env 0}}
map
\"Mounts\": [{...}]
{{range .Mounts}}{{.Source}}{{end}}
✅ 高级:辅助函数
json
\"Mounts\": [{...}]
{{json .Mounts}}
join
\"拼接内容\"
\"HostConfig\": { \"Binds\": [ \"/home...:/usr/...\"]
{{join .HostConfig.Binds \" \"}}
lower
/ upper
\"Name\": \"/nginx\"
{{lower .Name}}
{{upper .Name}}
转大写
printf
无
{{printf \"%.2f\" .SizeRw}}
✅ 最终:组合成命令
############################ 基础 ############################# 查看容器iddocker inspect -f \'{{.Id}}\' nginx# 查看容器创建时间docker inspect -f \'{{.Created}}\' nginx# 查看运行状态docker inspect -f \'{{.State.Status}}\' nginx############################ 进阶 ############################# 查看创建容器的映射路径docker inspect -f \'{{.HostConfig.Binds}}\' nginx# 查看创建容器的映射路径(只查看第一行)docker inspect -f \'{{index .HostConfig.Binds 0}}\' nginx# 查看容器的环境变量docker inspect -f \'{{index .Config.Env 0}}\' nginx# 遍历多组挂载路径docker inspect -f \'{{range .Mounts}}{{.Source}}{{end}}\' nginx############################ 高级 ############################# 查看容器的挂载路径,以json格式输出docker inspect -f \'{{json .Mounts}}\' nginx# 用空格拼接挂载目录docker inspect -f \'{{join .HostConfig.Binds \" \"}}\' nginx# 切换容器名为小写docker inspect -f \'{{lower .Name}}\' nginx# 切换容器名为大写docker inspect -f \'{{upper .Name}}\' nginx# 格式化数字输出docker inspect -f \'{{printf \"%.2f\" .SizeRw}}\' nginx
3️⃣ 常用速查表
使用命令嵌套使用,覆盖99%常用参数。
docker inspect -f \'\' 容器名
{{.Id}}
{{.Name}}
{{.Path}} {{join .Args \" \"}}
{{.Created}}
{{.State.Status}}
{{.State.Pid}}
{{.State.OOMKilled}}
{{.State.Error}}
{{.State.StartedAt}}
{{.State.FinishedAt}}
{{.HostConfig.Binds}}
{{.HostConfig.NetworkMode}}
{{.HostConfig.RestartPolicy.Name}}
{{.GraphDriver.Data.MergedDir}}
{{range .Mounts}}{{.Source}} {{end}}
{{.Config.Hostname}}
{{.Config.Env}}
{{index .Config.Env 0}}
{{.Config.Image}}
{{.Config.WorkingDir}}
{{range $p,$c := .NetworkSettings.Ports}}{{$p}}->{{(index $c 0).HostPort}}{{end}}
{{.NetworkSettings.Ports}}
{{.NetworkSettings.Gateway}}
{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}
{{.NetworkSettings.IPAddress}}
{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
{{.NetworkSettings.MacAddress}}
{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}
- 更多简便的查询命令([过滤],相对与使用如上命令简单点):
启动命令、容器ID、运行状态、端口映射
docker ps -a | grep 容器名
docker inspect 容器名 | grep -i created
docker inspect 容器名 | grep -i OOMKilled
docker inspect 容器名 | grep -i StartedAt
docker inspect 容器名 | grep -i FinishedAt
docker inspect 容器名 | grep -i NetworkMode
docker inspect 容器名 | grep -i MergedDir
docker inspect 容器名 | grep -i source
docker inspect 容器名 | grep -i hostname
docker inspect 容器名 | grep -i WorkingDir
docker inspect 容器名 | grep -i ipaddress
docker inspect 容器名 | grep -i macaddress
docker inspect 容器名 | grep -i gateway
4️⃣ 口诀速记
嵌套一路点到底,数组切片
index
,map 切片range
,数组或map过多用join
连接,模板单引号包起来。