应设置镜像保留策略,核心是保留正在使用或近期拉取/构建的镜像,清理未被引用且超期的镜像;Docker 24.0+ 支持 docker image prune --filter "until=..." 按创建时间自动清理,但需脚本辅助处理有标签却长期闲置的镜像,并叠加白名单、预检、最小保留数等安全措施。
要设置保留策略,只清理超过指定天数的镜像,核心是明确“保留什么”和“清理什么”——不是简单删旧镜像,而是确保正在用、近期拉取或构建的镜像不被误删。docker 原生命令支持时间过滤,但仅适用于 未被任何容器引用 的镜像;若需更精准控制(比如保留带标签但已停用 7 天以上的镜像),需配合脚本判断。
用 docker image prune --filter 按时间自动清理(推荐用于基础场景)
适用于 Docker 24.0+,能快速清理未被容器使用的旧镜像:
- 清理所有未被容器引用、且创建时间早于 7 天的镜像:
docker image prune -a -f --filter "until=168h" - 只清理特定仓库的旧镜像(如只清 myapp 的):
docker image prune -a -f --filter "reference=myapp:*" --filter "until=72h" - 注意:
--filter "until=..."是按镜像 创建时间(CreatedAt) 判断,不是拉取时间;且该命令默认跳过正在运行或已停止容器所使用的镜像,安全性较高。
保留有标签但长期闲置的镜像(需脚本辅助)
原生命令无法清理“有标签 + 未被使用 + 超期”的镜像(即你手动 pull 过、打了 tag、但之后再没启动过容器的镜像)。这时需脚本识别:
- 先获取所有容器当前使用的镜像 ID(含已停止):
docker ps -a --format '{{.Image}}' | xargs -r docker inspect --format='{{.Id}}' 2>/dev/null | sort -u - 再遍历本地镜像,筛选出:
– 不是 dangling(即 repo:tag 不为 <none>:<none>)
– ID 不在上述已用列表中
– 创建时间戳早于设定阈值(如 7 天前) - 示例关键逻辑(bash):
ts=$(date -d "$created_at" +%s 2>/dev/null)<br>[[ $ts -lt $THRESHOLD ]] && docker rmi "$repo_tag"
避免误删:必须加的保护措施
直接按时间删镜像风险高,务必叠加白名单与安全检查:
- 排除关键标签:在脚本中跳过
latest、stable、prod-等前缀的镜像,防止线上版本被清掉 - 预检模式:首次运行时用
echo替代docker rmi,输出待删列表人工确认 - 保留最小数量:即使超期,也至少留 3 个最近的非 latest 镜像,防误操作断供
- 清理后验证:
docker system df查看 RECLAIMABLE 是否增长,docker images确认关键镜像仍在
集成到定时任务(如 cron)实现自动化
把清理逻辑封装为可执行脚本(如 /usr/local/bin/docker-prune-old.sh),再加入系统定时任务:
- 每天凌晨 2 点执行:
0 2 * * * /usr/local/bin/docker-prune-old.sh >> /var/log/docker-prune.log 2>&1 - 建议先以“只读模式”运行一周,确认日志无误后再开启实际删除
- 搭配磁盘监控:当
df -h /var/lib/docker使用率 > 85% 时,额外触发一次强制清理(如删构建缓存docker builder prune -f)


















