daemon.json 不支持镜像标签自动清理,仅可配置构建缓存限制(如"defaultkeepstorage": "2g")和日志轮转(如"max-size": "100m"),标签清理须依赖外部脚本与定时任务。
daemon.json 是 docker 守护进程的全局配置文件,它本身不支持直接配置“镜像标签自动清理”逻辑。docker 官方未提供通过 daemon.json 实现按标签、时间或数量自动删除镜像的功能。
镜像标签清理属于运维策略与外部脚本控制范畴,不是守护进程的内置行为。daemon.json 可配置的是构建缓存管理、日志轮转、存储驱动参数等底层行为,而清理镜像标签需依赖 CLI 命令 + 定时任务(如 cron)或 CI/CD 流水线触发。
不过,你可以通过 daemon.json 间接支撑更可控、更可预测的镜像生命周期管理,具体如下:
✅ 1. 限制构建缓存大小(防 BuildKit 缓存爆炸)
BuildKit 构建过程中产生的中间层快照虽不显示在 docker images 中,但会大量占用 /var/lib/docker/buildkit/cache/。若不控制,会导致磁盘隐性耗尽。
在 /etc/docker/daemon.json 中添加:
{
"builder": {
"gc": {
"defaultKeepStorage": "2g"
}
}
}
✅ 重启生效:
sudo systemctl restart docker
✅ 效果:BuildKit 自动回收超过 2GB 的最久未用缓存层,避免残留构建产物干扰镜像列表
✅ 2. 启用并配置日志轮转(减少因日志膨胀误判磁盘压力)
虽然不直接清理标签,但日志失控常触发“磁盘满 → 清理失败 → 标签堆积”恶性循环。推荐统一配置:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
✅ 配合系统级
logrotate使用效果更稳(见知识库末尾日志配置)
❌ 不可行的误区(常见错误理解)
以下 不能 通过 daemon.json 实现:
-
auto-prune-tags: true(不存在该字段) -
prune-after-days: 30(Docker 不解析此类策略) -
keep-latest: 5(无此配置项) -
filter-tags: ["dev-*", "pr-*"](过滤逻辑必须由 shell 脚本或外部工具完成)
这类需求必须用外部脚本+定时任务实现,例如:
# 每日凌晨删掉 myapp 下非 latest 的旧标签(保留最近3个)
docker images 'myapp:*' --format '{{.Tag}} {{.ID}}' | grep -v '^latest$' | sort -k1,1r | tail -n +4 | awk '{print $2}' | xargs -r docker rmi
然后加入 crontab:
0 2 * * * /usr/local/bin/cleanup-myapp-tags.sh
? 总结关键点
-
daemon.json管的是 Docker 守护进程行为,不是镜像生命周期策略 - 真正的“标签自动清理”靠 shell 脚本 + cron / CI job / webhook 触发
-
daemon.json能做的,是帮你 压住缓存和日志这两头野马,让清理脚本更稳定、更少被磁盘告警打断 - 所有清理操作建议加
-f(强制)和--dry-run(如有支持)做预演,生产环境务必先测试
不需要写“本文将介绍”,也不需要复述标题。重点已说清。










