清理Harbor冗余镜像
在开发测试环境,因为频繁触发 CICD 构建流程,私有镜像仓库 Harbor 会出现存储用满的情况。这个时候,一般加存储扩容就可以解决。但是镜像的存储也不能无限加大,删除无人使用的冗余镜像是个可行的办法。本文提供删除镜像的一个办法。
准备registry-manager
registry-manager是一款第三方工具 https://github.com/TimeBye/registry-manager。
目前存放在神兵 cloud-map-native 仓库的 1.16 分支下。
它是 Go 语言实现的命令行工具,调用 Registry API 进行进行软删除。
下载可执行文件 registry-manager,编写 registry-manager.yml 文件。
|
|
上图的配置中其含义如下,删除 tag 数大于 10 的且创建时间在 72 小时之前的镜像。
执行删除
执行下面的命令开始进行软删除
registry-manager delete -c registry-manager.yml
界面会不停输出信息,报告当前的处理进度。具体耗时随镜像仓库的大小会有所不同,建议在避开开发测试人员使用镜像的高峰期来执行删除操作。
软删除成功后,去到 Harbor 所在的节点,以 harbor 用户身份进入 registryctl 容器:
docker exec -it --user harbor registryctl /bin/bash
执行删除命令,
# 测试执行,不会真回收,可在日志中看到要回收的镜像
$ registry garbage-collect --dry-run /etc/registry/config.yml
# 执行回收
$ registry garbage-collect /etc/registry/config.yml
执行完成后,可以看到存储明显下降了。
异常处理
关于异常的处理:
在执行的过程中遇到了这个问题:failed to mark: invalid checksum digest format
这有可能是镜像同步过程,被强行中断造成的结果。导致实际的后端存储和 harbordb 的数据不一致。处理流程如下:
根据 garbage-collect 中报出错误,定位是哪个 repo 形成了空链接。
去 harbor 节点对应的宿主机挂载路径,定位 repo 目录,以删除 library/nginx repo 为例。
切换到repo # cd /data/registry/docker/registry/v2/repositories/ 查看project,这一层对应了harbor下的项目 # ls # cd library 删除 # rm -fr nginx
删除后再次进入 harbordb 容器,执行硬删除操作。
删除过程可能耗时较长,完成后在 Harbor 界面上,可以看到剩余容量又回来了。
- 原文作者:hzliangbin
- 原文链接:https://www.liangbin.xyz/post/prune-harbor-images/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。