docker stats 命令需配合 --no-stream --format 控制字段与对齐,仅支持 .name、.cpuperc、.memperc 等有限字段,用 "{{.name}}\t{{.cpuperc}}\t{{.memperc}}" 并管道 column -t 实现对齐;.cpuperc 和 .memperc 为带 % 的字符串,不支持数值计算或条件判断,导出原始数值须借助 cadvisor 或 docker inspect。

stats 命令默认输出太乱,怎么用 --format 控制字段和对齐?
Docker stats 默认输出是动态刷新的表格,没法重定向、难解析,也看不出 CPU/内存占比的精确百分比。关键在 --format 参数,它支持 Go template 语法,但**不是所有字段都可用**——只有 .CPUPerc、.MemPerc、.Name、.Status 等少数几个被 stats 特殊暴露,不能直接访问原始字节数或核心数。
实操建议:
- 用双引号包裹 template 字符串,避免 shell 解析失败:
docker stats --no-stream --format "{{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}" -
--no-stream必须加,否则--format会失效(stream 模式下只支持固定字段模板) - 字段名大小写敏感,
.cpuperc或.CPUPercent都报错,正确是.CPUPerc - 想对齐列,用
\t分隔后配合column -t:例如docker stats --no-stream --format "{{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}" | column -t
为什么 .MemPerc 显示 12.34% 而不是数字 12.34?
.MemPerc 和 .CPUPerc 是字符串类型,自带百分号,无法直接参与数值比较或计算。比如你没法用 {{if gt .MemPerc "80%"}} —— Go template 的 gt 不支持字符串带单位的数值比较。
常见错误现象:
- 试图用
{{printf "%.1f" .MemPerc}}报错:因为.MemPerc是"12.34%"字符串,不是 float - 想过滤高内存容器,写
--format '{{if eq .Name "web"}}{{.MemPerc}}{{end}}'结果为空,因为--format不支持条件逻辑(仅支持字段插值,不支持 if/else 控制流)
解决思路:把 stats 当作数据源,用外部工具处理。例如提取纯数字:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
docker stats --no-stream --format "{{.Name}} {{.MemPerc}}" \
| sed 's/%$//' \
| awk '$2 > 75 {print $1, $2 "%"}'
实时报表要稳定刷新,怎么避免 stats 卡住或中断?
docker stats 在容器数量多、宿主机负载高时容易卡在某一行不动,尤其当有已退出但未清理的容器(Status 是 exited (0))时,--no-stream 模式可能直接 hang 住。
实操建议:
- 加超时控制:
timeout 5s docker stats --no-stream --format "{{.Name}} {{.CPUPerc}} {{.MemPerc}}" 2>/dev/null - 排除非运行中容器:
docker ps -q | xargs docker stats --no-stream --format "{{.Name}} {{.CPUPerc}}" - 避免用
docker stats $(docker ps -aq)——-a包含已退出容器,stats 会尝试收集它们的资源数据,而这些数据不存在,导致阻塞 - 生产环境做定时报表,建议用
docker stats --format+watch -n 2组合,但注意watch内部会截断长容器名,用watch -n 2 -d "docker stats --no-stream --format '...'"更可靠
想导出 CSV 或发到监控系统,哪些字段能取到原始数值?
docker stats 的 --format **不提供原始内存字节数、CPU 核心秒等底层指标**,只有百分比字符串。如果需要原始值做趋势分析或告警阈值计算,必须换方案。
可选路径:
- 用
docker inspect查单个容器的HostConfig.Memory和stats.memory_stats.usage,但这是快照,不是实时流 - 对接 cgroup 文件系统:
cat /sys/fs/cgroup/memory/docker/*.scope/memory.usage_in_bytes,但路径随 Docker 版本和驱动变化,不稳定 - 真正可靠的实时原始数据来源是
docker stats --no-stream --format+ Prometheus 的cadvisorexporter,它暴露container_memory_usage_bytes等指标,适合长期报表
简单脚本生成 CSV 的底线方案:只能用 .CPUPerc 和 .MemPerc,别指望拿到 MB/GB 数字。字段缺失不是你模板写错了,是 stats API 就没暴露。










