清理私有仓库过期镜像需区分本地缓存与远程存储:harbor用web界面删除后必须手动触发垃圾回收;通用registry需开启delete功能并调api或用reg cli删除;ci/cd中应前置预防性策略如自动保留最近5个tag。

清理私有仓库中过期的历史镜像,关键在于区分“本地 Docker 引擎缓存”和“远程私有仓库(如 Harbor、自建 registry)中的真实存储”。本地 docker rmi 不会影响私有仓库里的镜像,必须通过仓库自身机制操作。下面分场景说明核心方法:
确认哪些镜像算“过期”
不能只看标签名,得结合实际使用情况判断:
- 时间维度:比如最后推送/更新超过 30 天,且无拉取记录
-
标签策略:非
latest、非prod-开头、含dev/test/beta的标签通常可清理 - 使用痕迹:查 Harbor 的「镜像拉取日志」或 registry 的访问日志,确认是否长期未被调用
Harbor 仓库:优先用 Web 界面 + 垃圾回收
适合中小规模、需要人工复核的场景:
- 登录 Harbor → 进入目标项目 → 「镜像」页,勾选待删镜像(支持多选、按标签筛选)
- 点击删除 → 确认后,镜像只是“逻辑删除”,manifest 和 blob 仍占磁盘
- 必须手动触发「垃圾回收」(GC):顶部菜单 →「系统管理」→「垃圾回收」→「立即执行」
- GC 默认每 24 小时自动运行一次,但清理滞后;批量删完务必手动跑一次
通用 registry(v2 API):用 curl 或 reg CLI 自动化
适用于无 Web 界面的自建 registry 或需脚本批量处理的场景:
- 先确保 registry 配置开启删除功能:
delete: enabled: true - 获取 token:
curl -u "user:pass" -X POST https://reg.example.com/service/token?service=harbor-registry - 查 digest:
curl -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://reg.example.com/v2/myapp/manifests/v1.2 - 删 manifest:
curl -X DELETE -H "Authorization: Bearer $TOKEN" https://reg.example.com/v2/myapp/manifests/sha256:abc... - 更推荐用 reg 工具简化流程:
reg delete reg.example.com/myapp:v1.2 --insecure(加--insecure绕过证书校验)
CI/CD 流水线中预防性清理
与其事后清理,不如在构建阶段就控制冗余:
- 推送前加逻辑:只保留最近 5 个 tag,旧的自动删(Harbor API 可查 tags 列表再删)
- 用 Git 分支名打 tag 时,约定规则如
feature-xxx推送后 7 天自动清理 - 在 Jenkins/GitLab CI 中集成清理脚本,构建成功后触发「保留 prod 标签,删其余」
- 配合镜像扫描结果:Harbor 扫出高危 CVE 的旧镜像,直接标记为待清理











