配置镜像保留策略的核心是“按需保留、自动执行、安全兜底”,Harbor支持图形化多条件策略,Registry需API+GC手动清理,Nexus Pro提供灵活条件组合,通用避坑需前置验证引用与基础镜像。

配置镜像保留策略的核心是“按需保留、自动执行、安全兜底”——不是删得越多越好,而是确保关键镜像不丢、冗余镜像及时退场。
Harbor:用图形化策略精准控制
Harbor v2.0+ 内置保留策略,支持多条件组合,适合大多数企业场景:
-
按标签保留稳定版本:例如正则
^v[0-9]+\.[0-9]+\.[0-9]+$匹配语义化版本,再配合“每个标签前缀最多保留5个”,就能守住 v1.2.3、v1.2.4 等最近5个发布版 -
保护主干分支:单独加一条策略匹配
^main$|^prod$,设置“永不删除”或“至少保留3个”,避免误清生产基线镜像 -
分环境差异化保留:为
dev/前缀设“保留最近3天”,为test/设“保留最近7天”,为prod/设“保留最近10个且推送时间不早于30天” - 启用定时执行:在 Harbor 后台开启 cron 服务,设置每天凌晨2点自动触发策略,无需人工干预
原生 Registry:手动+脚本协同清理
Registry 没有界面策略,需靠 API + GC 分两步完成,重点在“先解绑、再回收”:
-
先删 tag,释放 manifest 引用:调用
DELETE /v2/<name>/manifests/<digest></digest></name>接口(需提前查出 digest),这一步真正移除标签可见性 -
再跑垃圾回收:确认 registry 配置中
delete.enabled: true,然后执行docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml -
加 dry-run 预演:首次运行务必加
--dry-run参数,查看将删哪些 layer 和 manifest,避免误伤共享基础镜像 - 建议封装为定时脚本:例如每周一上午清理 60 天前未被拉取的镜像 tag,配合日志记录和钉钉告警
Nexus Pro:条件组合更灵活
Nexus Repository Manager Pro 支持 Cleanup Policies,适合已有 Nexus 生态的企业:
-
三条件同时生效:比如“标签匹配
.*-snapshot” + “最后修改时间早于 14 天” + “每个项目最多保留 2 个”,逻辑清晰无歧义 - 绑定到具体仓库:在仓库配置页下拉选择策略,并勾选 “Apply cleanup policy”,策略会在每次新镜像上传后自动评估旧镜像
- 支持定时扫描:通过 Scheduled Tasks 设置每日凌晨执行全量扫描,比 Registry 更省心
通用避坑要点
不管用哪种工具,以下操作必须前置验证,否则容易引发部署中断:
- 不直接删 latest 标签:它常被 CI/CD 流水线硬编码引用,应改用语义化版本 + 自动打 latest 的方式管理
-
清理前校验是否被容器或编排系统引用:可通过
docker ps --format '{{.Image}}'或 K8s 中kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}'检查实时使用情况 -
保留至少一个基础镜像层:如
ubuntu:22.04或openjdk:17-jre-slim,避免因清理过猛导致新构建失败 - 所有策略上线前先小范围测试:例如先对 dev 项目启用,观察 48 小时无异常再推广至 prod


















