本节摘要:「--format」是散落在全书各词条里的高频选项,背后是同一套 Go 模板机制:点号取字段、双花括号做占位、table 前缀出表头、range 遍历列表、管道函数做加工。本节把这套机制讲透,再收拢 --filter 的常用谓词清单。学完可以给任何列表命令定制输出,把速查表升级成自己的巡检脚本。
前面各部反复出现的 --format '{{...}}' 一直按"照抄即可"处理,本节兑现它的原理。这套模板不只是 Docker 的私有发明——它是 Go 语言的模板语法,监控系统、CI 工具里随处可见,学一遍处处受用。
docker 命令 --format '模板字符串'
模板里的要素:双花括号包裹动作;点号代表当前对象,点号后跟字段路径;管道符把值喂给函数加工。
| 写法 | 含义 | 示例输出 |
|---|---|---|
{{.Id}} |
取 Id 字段 | a72860cb95fd |
{{.State.Status}} |
取嵌套字段 | running |
{{.Size}} |
取数值字段 | 187421948 |
table {{.Names}}\t{{.Status}} |
table 前缀出表头 | 表格输出 |
{{json .Mounts}} |
字段转 JSON 串 | [{...}] |
{{range .Mounts}}{{.Source}} {{end}} |
遍历列表字段 | /srv/app pgdata |
$ docker inspect web --format '{{.State.Status}} since {{.State.StartedAt}}' running since 2026-09-01T08:12:44.913Z $ docker inspect web --format '{{range .Mounts}}{{.Type}}:{{.Source}}->{{.Destination}} {{end}}' bind:/srv/app->/usr/share/nginx/html
段落模板的诀窍在 {{end}} 前换行——range 每轮输出一行,每个挂载一条。字段路径不知道怎么写时,先裸跑 docker inspect 容器,肉眼定位字段后照抄路径,这是零记忆成本的查表法。

过滤谓词与 format 是搭配最顺的组合:filter 圈对象,format 出报表。
docker ps --filter name=api --filter status=running docker ps -a --filter exited=137 docker ps --filter label=team=pay docker images --filter dangling=true docker images --filter before=nginx:1.25 docker volume ls --filter label=keep
| 命令对象 | 常用谓词 | 说明 |
|---|---|---|
| 容器 | name、status、exited、label、ancestor、since、before | 名字支持模糊匹配 |
| 镜像 | dangling、label、before、since、reference | reference 按通配匹配引用名 |
| 卷 | label、dangling | 未被引用即 dangling |
| 网络 | name、type、label | type=custom 排除内置网络 |
$ docker ps -a --filter status=exited --filter exited=137 \ --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' NAMES IMAGE STATUS batch-3 myapi:2.0 Exited (137) 2 hours ago
被内存处决的容器一表打尽,哪台机器上跑这条都不用改——这正是定制输出的工程价值:人读的默认输出会变,机器读的模板输出稳定。放进脚本时再配合 -q 取 ID、xargs 批量处置,就是捌部清理脚本的原型。
⚠️ 常见坑:模板里的花括号在 shell 双引号里可能被展开出意外内容,模板一律用单引号包裹;模板写错时命令通常静默输出空行而不是报错——输出比预期空,先怀疑模板路径写错。
模板与谓词合体,写一条日常巡检——列出退出码非零的容器,输出名字与状态:
$ docker ps -a --filter status=exited \ --format 'table {{.Names}}\t{{.Status}}' | head -n 5 NAMES STATUS batch-07 Exited (1) 26 minutes ago cron-sync Exited (137) 2 hours ago
退出码藏在 STATUS 文案里;要精确列就换 inspect 模板串联:docker inspect --format '{{.Name}} {{.State.ExitCode}}' $(docker ps -aq --filter status=exited)——ps -aq 出 ID、inspect 逐个抽字段,管道串起来正是速查表的进阶形态。存成 shell 别名,每日交接前跑一遍,异常退出无所遁形。
再送一条镜像卫生巡检:docker images --filter dangling=true -q | wc -l——数字不为零,就该约 image prune 谈谈了。巡检命令的写法万变不离其宗:谓词缩圈、模板定列、管道加工,三件套而已。
💡 谓词可以叠加:
--filter status=exited --filter name=batch先按状态再按名字收窄,多条件取交集。圈子越小,模板与管道的负担越轻。
顺带把 --no-trunc 归位:被截断的 ID 与摘要是脚本对账的天敌,写脚本一律加 --no-trunc 或用 -q 的完整短 ID;肉眼浏览才轮到默认截断。
全书词条到此收束:壹部教提问,贰至柒部按对象与场景给词条,捌部管救火与养护,玖部负责找得快。命令词典合上,剩下的功夫在终端里。