Harbor镜像删除回收?只看这篇

最近,公司的技术平台,运维的破事儿颇多。Jira无法访问,ES堆内存不足,Jenkins频繁不工作。。等等等,让我这个刚入门的小兵抓心脑肝,夜不能寐,关键时刻方恨经验薄弱呀!!一波未平,一波又起,这不,Harbor镜像库又无法访问了。查了下磁盘,发现/data目录已经占用了99%,这还怎么愉快的工作了。搞他就是了!

 

使用Harbor API删除镜像

网上找了太多的文章都是通过Python或者shell脚本写的,因为自身没弄过python,shell脚本也不熟,而且大多不符合我的特殊需求。所以我打算直接使用Spring boot ,并利用Quartz做定时任务检查,调用Harbor API,完成镜像的删除。由于harbor镜像库保存了公司所有项目的镜像,有些仓库下的镜像比较少,时间也比较久远,不少镜像都是继承的关系,不能单一的按照时间和数量做删除。这里我的策略是每个镜像仓库至少保留5个Tag;如果多于5个,则只保留最近15天的Tag。

 

完整代码我已贴到Github上,如果大家需要的话可以在文末找到。

 

Harbor镜像占用过多磁盘

 

docker镜像是分层的,registry在存储镜像的时候,将docker镜像分成了2部分:

镜像元数据(manifests),存储在docker/registry/v2/repositories目录中,在这里会看到registry上的项目、项目中的镜像、镜像到Layer的索引信息。

blobs,存储在docker/registry/v2/blobs目录中,在这里按00-ff分目录存储了所有镜像的layer。

如果有2个镜像使用了同一个基础镜像,那么在registry上存储的时候,blobs只有一份数据,而镜像元数据中两个镜像各自的索引都有一部分layer指向相同的layer。

举个例子。

初始状态,A、B两个镜像,都是基于layer a所做的镜像;A引用a,b,B引用a,c。

A -----> a <----- B \--> b | c <--/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgww.html