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 <--/
之后删掉B镜像(通过Harbor的web,或者通过api)
A -----> a B
\--> b
c
此时layer c实际已经没人用了,但是registry在删除B镜像时,只是会删除B的元数据,并不会主动删除layer c。
layer c就是无人照看的孤儿待回收的垃圾,需要GC。
果然 /data/registry/docker/registry这个目录占了600多GB,我们抓到了真凶。
GC回收
使用API,删掉镜像,UI上确实看不见了,但是我们发现磁盘并未释放,还需要回收GC。
使用docker ps, 我们可以看见harbor相关的9个容器。

进入镜像存储位置,我们使用 docker exec -it 3501 /bin/bash,进到registry这个容器里

df -h查看剩余空间

先dry-run一下,看看待删除的报告,此步不会真正执行删除。
registry garbage-collect --dry-run /etc/registry/config.yml

可以清理的blobs还是挺多的。去掉dry-run,实际跑一下
registry garbage-collect /etc/registry/config.yml
GC效果还可以,清理出来500GB左右的空间。
这里如果执行删除时提示对/storage/docker/registry/v2/blobs/sha256/5e/5e526656b6e423eb836829b95951913719a48efa2649189f0a039b068eb59e10/data 没有权限,在容器外执行
chmod -R 777 /data/registry/docker/registry/v2
给整个目录授权即可
Harbor API删除镜像代码,可以扫描下方二维码,关注,并私信,获取Github链接,还望兄弟们帮忙支持公号。
< END >
如果您喜欢这篇文章,还希望帮忙点赞分享,让更多的朋友能够参与其中,分享各自的感悟;也欢迎下方留言,和小伙伴一起探讨职场人生。 小墨唯一公众号 《DevOps特种部队》,分享我在国企数字化转型中,DevOps领域所有相关技术栈,也包含职场的苦与乐,希望各位老哥搜索或者扫描下方图片一键关注,给个支持!


Harbor镜像删除回收?只看这篇的更多相关文章
- V8垃圾回收?看这篇就够了!
什么是内存管理 内存管理是控制和协调应用程序访问电脑内存的过程.这个过程是复杂的,对于我们来说,可以说相当于一个黑匣子. 当咱们的应用程序运行在某个操作系统中的时候,它访问电脑内存(RAM)来达成下列 ...
- Java多线程超级详解(只看这篇就够了)
多线程能够提升程序性能,也属于高薪必能核心技术栈,本篇会全面详解Java多线程.@mikechen 主要包含如下几点: 基本概念 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数 ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- Pycharm新手教程,只需要看这篇就够了
pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...
- 在Linux主机使用命令行批量删除harbor镜像
在Linux主机使用命令行批量删除harbor镜像 脚本使用说明: 此脚本不是万能脚本,根据自身环境要调整很多 能用harbor的域名就不要用IP 脚本前半部分可以套用,后半部分需一步一步试错,结合 ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(上)
文章首发于微信公众号: 小哈学Java 镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录 ...
- windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看
windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...
- 集合类--最详细的面试宝典--看这篇就够用了(java 1.8)
看了一个星期源码,搜索上百篇博文,终于总结出了集合类的所有基础知识点,学集合,看这篇就够用了!!! 篇幅有点长, 如果你能全部理解,java最重要的集合就不怕了,秒过面试!!!(本篇素材来自网络,如有 ...
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...
随机推荐
- js 导出div 中的类容为 word 文件
//引入包 <script src="/FileSaver.js"></script> <script src="/jquery.word ...
- 图论补档——KM算法+稳定婚姻问题
突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...
- 【题解】NOI 系列题解总集
每次做一道 NOI 系列的估计都很激动吧,对于我这种萌新来说( P1731 [NOI1999]生日蛋糕 练习剪枝技巧,关于剪枝,欢迎看我的垃圾无意义笔记 这道题是有一定难度的,需要运用各种高科技剪枝( ...
- 3款pdf插件介绍
1.pdf.js:推荐使用.小窗口可以使用iframe来解决.ie8及以下不支持,但是360的兼容模式ie8下可以在新标签页中打开,在iframe中打不开,ie8中在新标签页也不支持打开.可使用ua- ...
- ORACLE 10g、11g批量刷新用户密码
一.ORACLE 10g批量刷新用户密码 select 'alter user ' || username ||' identified by values '''||password ||''';' ...
- torch中squeeze与unsqueeze用法
import torch torch中的squeeze与unsqueeze作用是去除/添加维度为1的行 例如,a=torch.randn(2,3) 那么b=a.unsqueeze(0),b为(1,2, ...
- 微信小程序自动化,记录趟过的坑!
项目思想:关键字+数据驱动混合测试 基于Android-微信小程序自动化的关键是:webview的切换 对于微信App来说如何从NATIVE切换到webview的过程 测试版本信息 1.微信版本:7. ...
- Vue - 与后端交互
零:与后端交互 - ajax 版本1 - 出现了跨域问题 前端:index.html <!DOCTYPE html> <html lang="en"> &l ...
- ssm的pom配置
<!--引入ssm依赖--> <!--常量和版本号 --> <properties> <!-- 文件编码 --> <project.build.s ...
- metinfo小于v6.2.0版本通杀SQL盲注漏洞分析
0x01 此漏洞是由于未将decode解码后的数据过滤,而直接带入SQL语句中,从而导致SQL盲注漏洞. 0x02 漏洞分析:此处复现为metinfo6.1.3版本,漏洞最初产生为:/app/syst ...