自建 Harbor 2.7 跑在 CentOS 7.9 上,存储用的本地文件系统,项目配额设了 50G,现在用到 49.8G,docker push 推到最后一层报 project quota exceeded,删了几个旧 tag 用量一动不动。
一开始怀疑是「配额是硬限制,推送最后一个层时直接被拒绝」,查了一圈,方向不对。
原因不止一个,得分开看。Harbor 的配额按存储层去重计算,删 tag 不会立刻回收 blob。另一种情况是回收站里还有没清理的 artifact,仍然计入项目用量。
不容易想到的是,后端存储的实际占用和数据库记录不一致,需要跑一次 GC。
动手时先看项目配额和当前用量
curl -u admin:xxx https://harbor.local/api/v2.0/quotas?reference=web | jq
再往下删掉不用的 artifact 再清空回收站
curl -X DELETE -u admin:xxx https://harbor.local/api/v2.0/projects/web/repositories/app%2Fweb/artifacts/1.8.0
触发一次垃圾回收任务
curl -X POST -u admin:xxx https://harbor.local/api/v2.0/system/gc/schedule -H 'Content-Type: application/json' -d '{"schedule":{"type":"Manual"}}'
末了按实际容量调整项目配额上限
curl -X PUT -u admin:xxx https://harbor.local/api/v2.0/quotas/3 -d '{"hard":{"storage":107374182400}}'
改完先别撤,确认这几项。项目用量降到 45G 以下,docker push 能完整走完所有层,Harbor 界面上不再出现配额告警。
补一句。删 tag 只是软删,真正释放空间要等 GC 跑完;GC 期间仓库最好只读,否则可能删掉正在推送的层。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
