清理策略

要不让自动清理误删关键版本,核心就是给关键版本加个“免死金牌”,告诉Harbor:这个版本不能删。具体来说,就是给关键镜像加个特殊的标签(比如prod、critical),然后在保留策略里加个规则:只要有这个标签的镜像,不管多旧都留着。

这里要先搞懂Harbor的标签和保留策略的匹配逻辑:Harbor会先执行所有保留规则,只要镜像符合任何一个保留规则,就会被留下;只有不符合所有保留规则的镜像,才会被清掉。所以只要我们把关键镜像的标签加到保留规则里,就不会被删。

比如我们给所有线上正在用的镜像都加prod标签,然后保留策略里加一条“留所有带prod标签的镜像”,再加上“留最近7天的非prod镜像”,这样既清了旧的非关键镜像,又不会删prod的版本。

GC 清理

保留策略(Retention):删“账本”——按业务规则决定哪些镜像该消失,删除的是数据库里的 artifact 记录和 tag。删完后磁盘空间并不释放。

垃圾清理(GC):扫“仓库”——把磁盘上已经没有任何记录引用的镜像文件(blob)物理删除,这才是真正释放磁盘空间的一步。

正确流水线是“保留策略先删记录 → GC 再回收 blob”。同时启动的话,GC 扫描时保留策略可能还没删完(或刚开始删),这批 blob 要再等 24 小时才能被回收;

GC 运行期间会把 registry 置为只读,而保留策略删镜像恰恰要调 registry 的删除接口——两者同时跑,保留策略的删除操作可能失败。

保留策略留在 00:00,GC 挪到 01:00(深夜顺序执行,互不干扰;历史上保留策略执行只需几秒到几十秒,1 小时余量足够)。

案例一:

比如这两条保留规则:

  1. 应用到仓库匹配**, 保留全部 artifacts基于条件tags匹配prod*
  2. 操作应用到仓库匹配**, 保留最近30天被推送过的 artifacts基于条件tags匹配**基于条件 无 Tag

此时在 GC 清理策略中,就不要开启允许回收无 tag 的 artifacts,否则会在下次执行定时任务的时候,把这些都清楚了,无法达到保留 30 天的效果。

效果就是:

  1. 标签 匹配 prod* → 总是保留(always)只要镜像的 tag 以 prod- 开头,无论推了多久,永久保留。这就是你要的“prod 排除在清理之外、永久保留”。
  2. 标签 匹配 **(含无 tag 镜像)→ 保留最近 30 天内推送的,其余所有镜像(dev-*、基础镜像 tag、无 tag 的悬空镜像)统一按 30 天窗口清理:30 天内推过的留下,超过 30 天的删掉。

两条规则之间是 “或” 的关系——命中任意一条就保留。

如果把规则 2 的“包含无 Tag 的 Artifacts”取消勾选——那样无 tag 镜像会在下次执行时(每天北京时间早上 07:00)直接清掉。

组合起来的实际效果:

镜像规则1(prod*→永久)规则2(其余→30天)结果
prod-20260101xxxx 推了 300 天命中—保留
dev-20261109xxxx 推了 3 天30天内保留
dev-20261001xxxx 推了 40 天超30天删除
无 tag 悬空镜像 推了 40 天超30天删除

案例二:

比如这三条保留规则:

  1. 应用到仓库匹配**, 保留全部 artifacts基于条件tags匹配prod*
  2. 操作应用到仓库匹配**, 保留最近30天被推送过的 artifacts基于条件tags匹配**
  3. 应用到仓库匹配**, 保留最近7天被推送过的 artifacts基于条件tags匹配**基于条件 无 Tag

GC 清理策略不要开启。如果保持开启,每天 05:00 会把所有无 tag 镜像直接物理删除,7 天缓冲就白设了。