Harbor清理长期不活跃测试镜像需三步:先用API按标签模式(如pr-*、test-)和push_time(如30天前)筛选artifact;再通过digest精准删除;最后调用GC接口释放磁盘空间,全程需预检、最小权限与安全窗口控制。

直接调用仓库 API 清理长期不活跃的测试镜像,核心在于“识别不活跃”+“安全删除”+“自动触发”。这不是简单删标签,而是结合创建时间、标签命名特征和引用状态的精准清理。
识别哪些算“长期不活跃的测试镜像”
关键不是看镜像有没有被运行,而是看它是否还在被主动维护或使用。通常符合以下全部条件的可判定为待清理目标:
- 标签名匹配测试模式,例如 pr-*、feature/*、dev-、test- 或包含 -snapshot
- 最后推送(即 artifact 创建)时间早于设定阈值,如 30 天前(Harbor 中对应
push_time字段) - 未被任何正在运行的容器或 Kubernetes 工作负载显式引用(需额外校验,API 本身不提供实时引用关系)
- 不属于受保护标签(如
latest、stable、prod-v*)
以 Harbor 为例:分步调用 API 实现自动化
Harbor v2.0+ 的 API 支持按时间与标签过滤查询,再逐个删除。推荐用 Python 脚本串联,比纯 curl 更健壮:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
-
第一步:获取项目下某仓库的所有 artifact 列表,并带时间戳
请求:GET /api/v2.0/projects/{proj}/repositories/{repo}/artifacts
参数加?page_size=100&with_tag=true&with_label=false,确保拿到 tag 和push_time -
第二步:筛选出符合条件的 artifact
对每个返回项,检查:tag.name是否匹配测试正则、push_time是否早于 30 天、且无protected标签 -
第三步:发起删除请求
对每个目标 artifact,调用:DELETE /api/v2.0/projects/{proj}/repositories/{repo}/artifacts/{digest}
注意:必须用digest(不是 tag 名),因为同一 digest 可能有多个 tag,删 digest 才真正释放 blob -
第四步:触发垃圾回收(GC)
删除后立即调用:POST /api/v2.0/system/gc/schedule,否则磁盘空间不会释放
安全执行的三个硬性建议
避免误删导致回滚失败或构建中断:
-
绝不跳过预检:每次执行前先用
GET请求输出将要删除的列表(含 digest、tag、push_time),人工确认后再跑删除逻辑 -
权限最小化:API 账号仅授予目标项目的
content_admin权限,禁用超级管理员 token - 保留最小安全窗口:生产环境建议设为 45 天,测试环境可用 14–30 天;首次运行时先设成 7 天试跑,观察日志再调长
补充:Nexus 或其他仓库怎么适配?
原理一致,只是端点和字段名不同:
-
Nexus Repository Manager 3:用
GET /service/rest/v1/search?repository=docker-registry&name=myapp&sort=version&direction=asc查镜像,再通过DELETE /service/rest/v1/components/{id}删除 -
AWS ECR:用
aws ecr describe-images获取imagePushedAt和imageTags,再用aws ecr batch-delete-image批量删 - 共性提醒:所有仓库删除后都需对应执行 GC 或清理任务,否则空间不释放
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










