Docker镜像仓库保留策略核心是按规则自动识别并清理旧版本,确保删得准、不误伤、真释放空间;Harbor用图形化策略+定时触发,Registry需API+GC三步闭环,Nexus Pro支持条件组合清理,通用原则强调保留稳定标签、校验引用、dry-run验证及强制GC。

在 Docker 镜像仓库中配置镜像保留策略,核心是让系统按规则自动识别并清理旧版本,而不是靠人工翻列表删 tag。不同仓库实现方式差异较大,关键不在“能不能删”,而在“删得准、不误伤、真释放空间”。下面分主流场景说明实际可落地的配置要点。
Harbor:用图形化策略+定时触发最稳妥
Harbor v2.0+ 内置 Retention Policy,适合大多数企业私有仓库:
- 进入项目(Project)设置 → “Retention” → 点击“New Retention Rule”
- 条件组合建议:Tag 匹配正则 + 推送时间限制 + 数量上限,例如:
- Tag 满足
^v[0-9]+\.[0-9]+\.[0-9]+$(只管语义化版本) - 且推送时间早于 90 天
- 且每个标签前缀(如
app-)最多保留 5 个
- Tag 满足
- 务必先勾选“不可变标签(Immutable Tags)”,避免清理过程中 tag 被覆盖导致误删
- 首次启用选“手动触发”,确认日志里删的是预期镜像;验证无误后设为 Cron 定时(如每天凌晨 2:00)
Docker Registry:需脚本+API+GC 三步闭环
原生 Registry 没界面、没策略引擎,必须自己串联操作:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 第一步:确保开启删除功能——
config.yml中 storage 段添加delete: { enabled: true },重启生效 - 第二步:用脚本调 API 获取所有 tag,再通过 HEAD 请求提取
Docker-Content-Digest,按时间或名称排序后筛选出要删的 digest(不能直接删 tag 名,必须删 digest) - 第三步:停 registry 服务,执行
registry garbage-collect --dry-run预览,确认后再运行真实 GC。否则 blob 层不会释放 - 推荐工具:用
regctl简化操作,例如:regctl manifest delete myreg:5000/app@sha256:abc123
Nexus Repository Manager(Pro 版):条件组合灵活,适合多环境
Nexus OSS 不支持清理策略,Pro 版可在仓库级绑定 Cleanup Policies:
- 路径:仓库配置页 → “Cleanup Policies” → 新建策略
- 支持 AND 条件:例如“Tag 匹配
^dev-|^test-” 且 “最后修改时间早于 7 天” 且 “保留最少 2 个” - 执行时机有两个选项:上传新镜像时自动评估(轻量);或设 Scheduled Task 每日凌晨扫描(更彻底)
- 注意:策略仅对新上传镜像生效,历史镜像需手动触发一次“Run Cleanup”
通用安全原则:所有策略都绕不开这四条
无论用哪个平台,以下动作必须做,否则极易误删或白清理:
-
保留稳定标识:
latest、stable、main、prod等标签建议显式排除在清理范围外 - 校验引用关系:删除前确认该 digest 没被任何运行中容器、K8s Pod 或其它镜像 base 引用(Harbor 日志含 digest,可用它查引用)
- 强制 dry-run 和日志记录:所有自动清理任务必须先预览、记录待删列表、保留 7 天以上日志
- 空间释放要靠 GC:删 tag ≠ 释放磁盘。Harbor 自带 GC;Registry 必须停服跑 garbage-collect;Nexus Pro 清理后自动触发存储优化

















