9.2 选项与格式化输出详解:--format 模板与 --filter 谓词


9.2 选项与格式化输出详解:--format 模板与 --filter 谓词

本节摘要:「--format」是散落在全书各词条里的高频选项,背后是同一套 Go 模板机制:点号取字段、双花括号做占位、table 前缀出表头、range 遍历列表、管道函数做加工。本节把这套机制讲透,再收拢 --filter 的常用谓词清单。学完可以给任何列表命令定制输出,把速查表升级成自己的巡检脚本。

前面各部反复出现的 --format '{{...}}' 一直按"照抄即可"处理,本节兑现它的原理。这套模板不只是 Docker 的私有发明——它是 Go 语言的模板语法,监控系统、CI 工具里随处可见,学一遍处处受用。

词条卡:--format 的语法骨架

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

现场:从全量 JSON 到一行摘要

$ 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 容器,肉眼定位字段后照抄路径,这是零记忆成本的查表法。

模板解剖:一张图看懂求值过程

模板解剖:一张图看懂求值过程

词条卡:--filter 谓词清单

过滤谓词与 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;肉眼浏览才轮到默认截断。

本节要点回顾

  • format 是 Go 模板:点号取字段、管道过函数、range 遍历、table 出表头。
  • 查字段靠裸跑 inspect:肉眼定位路径再写模板,零记忆成本。
  • filter 圈对象、format 出报表:组合是巡检脚本的标准骨架。
  • 模板用单引号包:输出莫名空白时先查模板路径。
  • 机器读模板、人读默认:脚本输出永远 format 定型。

全书词条到此收束:壹部教提问,贰至柒部按对象与场景给词条,捌部管救火与养护,玖部负责找得快。命令词典合上,剩下的功夫在终端里。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U