清理Docker历史镜像应先删悬空镜像(docker image prune -f),再按标签保留最新N个版本或按创建时间删除超期未用镜像,并集成防护机制与定时任务。

清理 Docker 历史镜像的关键是精准识别“无用镜像”——即既未被容器引用、也未被 tag 标记的悬空(dangling)镜像,以及长期未使用的旧版本镜像。自动化脚本需兼顾安全性(避免误删)和实用性(按需保留策略)。
只删悬空镜像(最安全的起点)
悬空镜像(ID 为 <none>)是构建或 pull 过程中产生的中间层,不被任何 tag 引用,也不被运行/停止的容器使用,可放心清理。
- 命令:
docker image prune -f - 加
-a可同时清理所有未被容器引用的镜像(含带 tag 的),但需谨慎——确认没有停止但待重启的容器依赖它们 - 建议首次运行时先去掉
-f,用docker image prune -a --dry-run预览将删哪些镜像
按标签规则保留最新 N 个版本
若镜像按语义化版本打 tag(如 myapp:1.2.0、myapp:1.2.1),可通过 shell 脚本筛选并保留最新几个版本,其余删除。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 示例:保留每个镜像名下最新的 3 个 tag(排除
latest单独处理) - 用
docker images --format "{{.Repository}}:{{.Tag}}" | grep -v ':<none>$'</none>获取所有有效镜像引用 - 对每个仓库名(如
myapp),用sort -V按版本号排序,用tail -n +4跳过最新 3 个,再传给docker rmi - 注意:确保 tag 命名规范(否则
sort -V失效),避免混用v1.2.0和1.2.0
按创建时间清理超过 X 天的未用镜像
适合测试/CI 环境,对无 tag 或低频使用的镜像设置生命周期。
- 用
docker images --format "{{.ID}} {{.CreatedSince}} {{.Repository}}:{{.Tag}}" | grep -v '<none>'</none>提取信息 - 解析
CreatedSince字段(如 “2 weeks ago”、“3 days ago”),或改用--format "{{.ID}} {{.CreatedAt}}"获取 ISO 时间,用date -d计算天数 - 只对
docker ps -aq | xargs docker inspect --format='{{.Image}}' 2>/dev/null | sort -u以外的镜像执行删除 - 推荐阈值:7 天(开发机)、30 天(预发环境)
集成进定时任务(cron)并加日志与保护机制
脚本上线前必须加防护,避免影响线上服务。
- 开头检查:
if [ $(docker ps -q | wc -l) -gt 0 ]; then echo "有运行中容器,继续"; else echo "无容器运行,跳过清理"; exit 0; fi - 记录日志:
docker image prune -f 2>&1 | tee -a /var/log/docker-prune-$(date +\%F).log - 加入 cron(每天凌晨 2 点):
0 2 * * * /usr/local/bin/docker-prune.sh >> /var/log/docker-prune-cron.log 2>&1 - 生产环境建议加人工确认环节(如检测到将删 >5 个镜像时发邮件告警)

















