高级java每日一道面试题-2026年01月18日-实战篇[Docker]-如何清理仓库中的旧镜像?

Docker Registry 仓库旧镜像清理:原理、策略与实践

随着微服务持续集成与交付,镜像仓库中会堆积大量历史版本、测试构建和无用标签。这些"旧镜像"不仅占用大量存储,还可能导致安全漏洞遗留、管理混乱以及拉取效率下降。清理仓库中的旧镜像是镜像治理的重要环节,需要理解 Registry 的存储机制、清理策略以及垃圾回收原理。


一、为什么需要清理旧镜像?

原因 影响
存储成本 镜像层是累积的,大量历史版本会快速消耗对象存储或磁盘空间
安全合规 包含已知漏洞的旧镜像可能被误拉取部署,扩大攻击面
管理效率 仓库镜像列表臃肿,开发者难以快速定位最新有效版本
性能 Registry 元数据膨胀,API 查询变慢;过多标签增加索引压力
备份与复制 大量无用镜像拖慢跨站点复制和灾备流程

二、Registry 存储模型与清理对象

Docker Registry 将镜像分解为内容寻址的 Blob (层数据)和Manifest(清单,指向 config 和 layers)。标签(tag)只是 Manifest 的别名。清理操作的核心是:

  • 删除标签:移除标签与 Manifest 的引用关系。
  • 垃圾回收(GC):扫描所有 Manifest,找出未被任何标签或 Manifest List 引用的 Blob,安全删除。

清理目标对象

  • 特定标签(如 v1.0-old
  • 符合条件的一组标签(如 build-*、创建超过 90 天的标签)
  • 悬空 Manifest(无任何标签指向)
  • 未使用的 Blob(通过 GC 清理)

三、核心清理方式对比

方法 适用仓库 原理 自动化程度 安全性
Harbor 标签保留策略 Harbor 配置策略,自动删除过期标签,定期触发 GC 高(策略驱动) 高,支持预览与审计
Harbor 手动删除 Harbor UI 或 API 删除指定标签,手动执行 GC 低(需人工) 中,容易误操作
Docker Registry 原生 GC 开源 Distribution 通过 API 删除标签,执行 registry garbage-collect 删除 Blob 低(需脚本配合) 低,GC 过程需只读,有风险
商业仓库特性(ACR/ECR) 云服务 内置生命周期策略,自动删除未使用的镜像或旧版本 高,通常提供保护机制

推荐:生产环境中优先使用 Harbor 或云厂商提供的生命周期策略功能,通过规则而非手动操作保证一致性与合规性。


四、清理流程与原理详解

4.1 Harbor 标签保留策略与 GC 流程

Harbor 通过标签保留策略 定义要自动清理哪些镜像,并结合垃圾回收释放空间。工作原理如下:
存储后端 Docker Registry Job Service Harbor Core 管理员 存储后端 Docker Registry Job Service Harbor Core 管理员 #mermaid-svg-dLp6KQgQxbYSaqVm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dLp6KQgQxbYSaqVm .error-icon{fill:#552222;}#mermaid-svg-dLp6KQgQxbYSaqVm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dLp6KQgQxbYSaqVm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dLp6KQgQxbYSaqVm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dLp6KQgQxbYSaqVm .marker.cross{stroke:#333333;}#mermaid-svg-dLp6KQgQxbYSaqVm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dLp6KQgQxbYSaqVm p{margin:0;}#mermaid-svg-dLp6KQgQxbYSaqVm .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dLp6KQgQxbYSaqVm text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-dLp6KQgQxbYSaqVm .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-dLp6KQgQxbYSaqVm .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-dLp6KQgQxbYSaqVm .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-dLp6KQgQxbYSaqVm .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-dLp6KQgQxbYSaqVm #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-dLp6KQgQxbYSaqVm .sequenceNumber{fill:white;}#mermaid-svg-dLp6KQgQxbYSaqVm #sequencenumber{fill:#333;}#mermaid-svg-dLp6KQgQxbYSaqVm #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-dLp6KQgQxbYSaqVm .messageText{fill:#333;stroke:none;}#mermaid-svg-dLp6KQgQxbYSaqVm .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dLp6KQgQxbYSaqVm .labelText,#mermaid-svg-dLp6KQgQxbYSaqVm .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-dLp6KQgQxbYSaqVm .loopText,#mermaid-svg-dLp6KQgQxbYSaqVm .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-dLp6KQgQxbYSaqVm .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-dLp6KQgQxbYSaqVm .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-dLp6KQgQxbYSaqVm .noteText,#mermaid-svg-dLp6KQgQxbYSaqVm .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-dLp6KQgQxbYSaqVm .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dLp6KQgQxbYSaqVm .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dLp6KQgQxbYSaqVm .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dLp6KQgQxbYSaqVm .actorPopupMenu{position:absolute;}#mermaid-svg-dLp6KQgQxbYSaqVm .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-dLp6KQgQxbYSaqVm .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dLp6KQgQxbYSaqVm .actor-man circle,#mermaid-svg-dLp6KQgQxbYSaqVm line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-dLp6KQgQxbYSaqVm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 策略存储到 DB loop定时任务 (或手动触发) 配置项目保留策略(保留最近 10 个活跃标签,删除 30 天前的构建标签)触发保留策略任务列出项目下所有标签及元数据根据策略规则计算待删除标签列表调用 API 删除符合条件的标签确认标签已移除更新任务状态手动触发 GC (或在策略后自动)触发 GC 任务标记 Registry 为只读执行 GC,扫描 manifest,清理孤立 Blob删除未引用的 Blob取消只读,恢复正常服务GC 完成报告

关键原理

  • 规则引擎:Harbor 支持"保留"和"删除"两种动作,可根据标签名(正则)、创建时间、是否被拉取等条件筛选。常用策略为"保留最近 N 个版本"、"按标签前缀过滤"。
  • GC 的必要性:仅删除标签不会释放存储空间,因为 Blob 依然存在。GC 会找出没有标签引用的 Blob 并物理删除。GC 期间 Registry 是只读的,需要维护窗口。
  • 安全机制:Harbor 的保留策略支持"模拟运行"(dry run),先预览影响再执行,避免误删。

4.2 Docker Distribution 原生 GC 原理

对于未使用 Harbor 的原始 Registry,清理流程分为两步:

  1. 通过 Registry API 删除标签 :发送 DELETE /v2/<name>/manifests/<reference> 请求,将 Manifest 的标签移除。注意:如果启用了"不可变标签"配置,则不能删除。
  2. 执行垃圾回收 :运行 registry garbage-collect 命令,它会:
    • 扫描所有存在的 Manifest。
    • 遍历所有 Blob,标记被 Manifest 引用的 Blob。
    • 删除未被引用的 Blob。
    • 要求在 Registry 处于只读或无请求时进行,否则可能导致并发问题。

原生方式的不足:无定时策略,需外部脚本;无 UI 保护,风险较高。


五、清理策略设计最佳实践

为了在 Java 微服务交付中有效管理镜像,应制定明确的标签规范和清理策略:

策略项 推荐做法 示例
语义化版本保留 保留所有正式发布的语义版本(如 1.2.3)不自动删除;仅清理临时/预发标签 删除 SNAPSHOT-*,保留 release-*
按构建标签清理 清理所有 CI 自动生成的构建标签(如 build-20250501-001),保留最近 N 个 保留最近 20 个构建,其余删除
时间条件 删除超过 X 天未拉取且非最新版本的镜像 删除 90 天未拉取的非发布标签
不可变标签 对生产环境使用的固定标签(如 v1.0.0)设为不可变,防止误删 Harbor 支持按仓库启用不可变性
安全扫描联动 自动删除扫描发现高危漏洞的旧镜像,或禁止下载 结合 Trivy/Clair,使用 Harbor 漏洞阻断策略
容量配额 设置项目容量限制,超出后自动清理或拒绝推送 Harbor 项目配额管理

自动化设计

  • 在 CI/CD 管道中,每次成功发布后,保留最终版本标签,同时删除本次构建的临时标签(若不再需要)。
  • 利用 Harbor 的保留策略调度,每日凌晨执行清理,避开业务高峰。
  • 对于共享基础镜像(JDK、Tomcat),使用代理缓存并设置较短的保留期,仅保留最新补丁版本。

六、风险与注意事项

风险 说明 规避方法
误删生产标签 清理策略过于激进,导致正在使用的镜像标签被删除,可能引起 Kubernetes 拉取失败 严格区分发布标签与临时标签;对生产标签启用不可变性;使用 dry run 预览
GC 导致服务中断 Docker Distribution GC 需只读状态,可能影响并发推送/拉取 安排在低峰期窗口;Harbor 的 GC 可配置为自动执行,但需评估影响
层共享误删 不同仓库或标签共享同一 Blob,若一个标签删除后执行 GC,仍保留被其他标签引用的层(GC 是引用计数),一般不会误删,但需确认 确保 GC 正确实现引用扫描
元数据未清理 仅删除标签而不 GC,存储不释放,空间压力继续 定期间隔 GC,或启用 Harbor 的自动 GC(1.9+)
合规数据留存 某些行业要求保留镜像至少 N 年 清理策略需排除审计要求范围内的镜像

七、思维导图总结

#mermaid-svg-GxMZMWmPRTGtvS71{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GxMZMWmPRTGtvS71 .error-icon{fill:#552222;}#mermaid-svg-GxMZMWmPRTGtvS71 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GxMZMWmPRTGtvS71 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GxMZMWmPRTGtvS71 .marker.cross{stroke:#333333;}#mermaid-svg-GxMZMWmPRTGtvS71 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GxMZMWmPRTGtvS71 p{margin:0;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge{stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .section--1 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section--1 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section--1 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section--1 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section--1 text{fill:#ffffff;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth--1{stroke-width:17;}#mermaid-svg-GxMZMWmPRTGtvS71 .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-0 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-0 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-0 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-0 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-0 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-0{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-0{stroke-width:14;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-1 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-1 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-1 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-1 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-1 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-1{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-1{stroke-width:11;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 text{fill:#ffffff;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-2{stroke-width:8;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-3 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-3 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-3 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-3 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-3 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-3{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-3{stroke-width:5;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-4 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-4 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-4 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-4 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-4 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-4{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-4{stroke-width:2;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-5 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-5 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-5 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-5 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-5 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-5{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-5{stroke-width:-1;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-6 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-6 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-6 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-6 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-6 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-6{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-6{stroke-width:-4;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-7 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-7 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-7 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-7 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-7 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-7{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-7{stroke-width:-7;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-8 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-8 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-8 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-8 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-8 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-8{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-8{stroke-width:-10;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-9 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-9 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-9 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-9 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-9 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-9{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-9{stroke-width:-13;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-10 rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-10 path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-10 circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-10 polygon,#mermaid-svg-GxMZMWmPRTGtvS71 .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-10 text{fill:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .node-icon-10{font-size:40px;color:black;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .edge-depth-10{stroke-width:-16;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled circle,#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:lightgray;}#mermaid-svg-GxMZMWmPRTGtvS71 .disabled text{fill:#efefef;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-root rect,#mermaid-svg-GxMZMWmPRTGtvS71 .section-root path,#mermaid-svg-GxMZMWmPRTGtvS71 .section-root circle,#mermaid-svg-GxMZMWmPRTGtvS71 .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-GxMZMWmPRTGtvS71 .section-root text{fill:#ffffff;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-root span{color:#ffffff;}#mermaid-svg-GxMZMWmPRTGtvS71 .section-2 span{color:#ffffff;}#mermaid-svg-GxMZMWmPRTGtvS71 .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-GxMZMWmPRTGtvS71 .edge{fill:none;}#mermaid-svg-GxMZMWmPRTGtvS71 .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-GxMZMWmPRTGtvS71 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 仓库旧镜像清理
为什么清理
降低存储成本
减少安全风险
提升管理效率
加速复制备份
清理对象
旧标签
悬空 Manifest
未引用 Blob
清理方式
Harbor 保留策略
按数量保留
按时间过滤
按标签正则
Dry Run 预览
Harbor 手动清理
Registry 原生 GC
删除标签API
执行garbage-collect
云服务生命周期策略
流程
定义策略
自动删除标签
执行GC释放空间
最佳实践
区分发布/临时标签
不可变标签保护生产
保留最近N个构建
定期GC窗口
集成安全扫描
风险控制
Dry Run 预览
生产标签不可变
低峰期执行
审计日志记录

掌握上述理论,可系统性地回答如何在不同 Registry 环境中安全、高效地清理旧镜像,体现镜像治理与运维的成熟度。

相关推荐
禹凕1 小时前
Linux基础——环境
linux·运维·服务器·ubuntu
iiiiyu1 小时前
IO流(二)
java·开发语言·数据结构·编程语言
白露与泡影1 小时前
牛客网大厂Java面试题全集(2026版,附答案)
java·开发语言
_Evan_Yao1 小时前
一文搞懂:Git分支管理与团队协作规范——从GitFlow到GitHub Flow,从rebase到merge,打造高效协作流
java·git·后端·github
未若君雅裁2 小时前
AQS 与 ReentrantLock:队列同步器与可重入锁
java
码语智行2 小时前
系统启动时初始化数据功能分析
java·spring boot
得物技术2 小时前
用 LLM Agent 重构告警排查流程|得物技术
java·人工智能·后端
Byron__2 小时前
RabbitMQ 面试核心精讲
java·面试·rabbitmq
Java面试题总结2 小时前
AgentScope Harness 深度实战:让Java智能体从“Demo可用”走向“生产可用”
java·开发语言·wpf