能否按镜像/项目/全局维度限制Harbor的镜像推送制品数量?
如何限制Harbor仓库中镜像制品的推送数量
一、Harbor原生管控方案(项目/全局层面)
Harbor本身没有直接的「按数量限制推送」开关,但可以通过以下原生能力实现近似管控:
- 项目级存储配额:进入目标项目的「设置」-「存储配额」,配置项目的最大存储容量(比如100GB)。当项目存储占用达到上限时,新的镜像推送会直接失败,强制团队清理旧制品。这种方式是按容量而非数量限制,适合整体管控项目存储规模。
- 全局存储配额:在Harbor系统设置的「存储」模块,配置全局存储总配额,所有项目共享这个限制,超出后整个仓库无法推送新镜像。
二、镜像级精确数量限制(自定义实现)
如果需要精确到单个镜像的数量上限(比如你提到的loose/greedy保留10个制品),需要结合CI/CD流程或自定义服务实现:
- CI流水线前置校验
在GitLab CI推送镜像前,先通过Harbor API查询目标镜像的现有制品数量,达到上限则终止推送:
# 配置Harbor认证信息 HARBOR_DOMAIN="your-harbor-domain" HARBOR_USER="your-username" HARBOR_PWD="your-password" PROJECT_NAME="loose" REPO_NAME="greedy" MAX_COUNT=10 # 查询当前镜像的制品数量 ARTIFACT_COUNT=$(curl -s -u "${HARBOR_USER}:${HARBOR_PWD}" \ "https://${HARBOR_DOMAIN}/api/v2.0/projects/${PROJECT_NAME}/repositories/${REPO_NAME}/artifacts" | jq '. | length') # 判断是否达到上限 if [ "$ARTIFACT_COUNT" -ge "$MAX_COUNT" ]; then echo "Error: 镜像${PROJECT_NAME}/${REPO_NAME}的制品数量已达上限(${MAX_COUNT}个),请先清理旧制品再推送" exit 1 fi # 继续执行镜像推送流程 docker push "${HARBOR_DOMAIN}/${PROJECT_NAME}/${REPO_NAME}:new-tag"
- Harbor Webhook+自定义校验服务
配置Harbor的webhook,在镜像推送触发时调用自定义服务:
- 自定义服务通过Harbor API查询目标镜像的制品数量
- 若超出上限,直接调用Harbor API删除新推送的镜像,或通过Harbor的拦截机制拒绝推送请求
三、兼顾K8s在用镜像的优化方案
如果你担心自动清理误删K8s集群中正在使用的镜像,可以实现自定义清理脚本:
- 先通过K8s API收集所有运行中Pod使用的镜像摘要/标签
- 调用Harbor API查询仓库内的所有镜像,过滤掉K8s在用的制品
- 只清理超出数量上限的未使用制品,既控制存储规模,又避免误删业务依赖镜像
内容的提问来源于stack exchange,提问作者SteveFishHuntCode
相关产品推荐
相关产品推荐

