harbor定时清理镜像

​ 分享下最近写harbor仓库镜像自动清理脚本思路,很长时间不写shell脚本,这次的脚本也是匆匆写的,还有很多可优化点,感兴趣的可以参考自己优化下,写的不完善地方也希望指出。

​ 说下harbor仓库清理的思路,其实思路也比较简单,就是找到要清除的镜像地址,根据自己需要对时间排序清除不需要的就行。那么关键点来了,如何有效找出需清除的镜像和时间tag关联起来呢这是问题的核心,在写脚本前也参考了网上他人的脚本,大部分人都是通过python实现的,用shell实现的也无法满足我的需求,那接下来刨析下我的脚本。

  • 环境需求

    harbor1.7.4

    保留近期5个镜像

    tag是没构建一次+1操作,但是因为实际也不确定可能存在误差就没有从这个方向考虑

  • 思路:

    1. 找出所有满足5个镜像以上的镜像
    2. 根据找到的镜像名称对应时间排序
    3. 找到关联时间的tag删除

harbor提供了众多的api,我这里只有一个项目,多个项目的可以参考举一反三

# 查找项目下所有对应的镜像信息
curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/search?q=项目名称" # 获取指定镜像信息(镜像仓库地址格式化切割,将"/"换成"%2F")
curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/repositories/镜像仓库名称/tags" #删除镜像(tag根据实际情况来写)
curl -s -k -X DELETE "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/repositories/镜像仓库名称/tags/具体的tag"
  1. 找出所有满足5个镜像以上的镜像

    # 通过api查找到所有对应的镜像地址,这里有个"tags_count"就是镜像的tag数,通过tag数判断>5筛选出对应的镜像"repository_name",刚开始一直在想通过管道连接的方式一条语句判断出来,结果确实没有想到好的方法判断出来,退而求其次选择了现在的方法,将获取到的值保存到文件中,根据自己的需要构造一个新的文件。
    
    #获取所有tags_count
    COUNT=$(curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/search?q=项目名称 " |grep "\"tags_count\""|awk -F "\"" '{print $3$4}' | awk -F "" '{print $3$4}') #获取所有repository_name
    REPS=$(curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/search?q=项目名称 " |grep "\"repository_name\""|awk -F "\"" '{print $4}') # 接下来就是根据需求造文件,我这里想要的格式是 tags_count ,repository_name在同一行一一对应关联起来。 for i in $COUNT
    do
    echo $i >> test_count.txt
    done
    for y in $REPS
    do
    echo $y >> test_server.txt
    done #合并俩个文件拼接出新的文件,新的文件count_and_server.txt里面存放的就是我们造好的数据。
    paste test_count.txt test_server.txt > count_and_server.txt #删除不需要的文件
    rm -rf test_count.txt
    rm -rf test_server.txt
    rm -rf server.txt #循环读取每一行并判断,这里根据tab切割第一个值是tags_count,第二个值对应repository_name,判断大于5将服务读取到server.txt,这样server.txt里面就是我们所有需要清除的镜像
    FILENAME=count_and_server.txt cat $FILENAME | while read LINE
    do
    new_str=$(echo $LINE | cut -d " " -f1)
    new_str1=$(echo $LINE | cut -d " " -f2)
    if [ $new_str -gt 5 ]
    then
    echo $new_str1 >> server.txt
    fi
    done
  2. 根据找到的镜像名称对应时间排序并删除

    # 通过server.txt里面的镜像我们就可以找对应的created时间
    
    # 替换server.txt文件中"/""
    sed -i 's@\/@%2F@g' server.txt # #通过server.txt文件找到所有可删除的时间
    SERVER_NAME=server.txt
    cat $SERVER_NAME | while read LINE
    do
    # 继续造文件,造一个时间和tag名称对应的文件,这里文件是奇数行是created时间。偶数行是tag名称
    name_date=$(curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/repositories/${LINE}/tags" |egrep "\"created|name\""|awk -F "\"" '{print $4}') for date in $name_date
    do
    echo $date >> date.txt
    done
    echo "++++++++++++++++++++++++++++++++++" #合并两行,将时间和tag名称放到一行一一对应
    awk '{if(NR%2!=0)ORS=" ";else ORS="\n"}1' date.txt >> new_date.txt # 按时间排序
    sort -r new_date.txt > new1_date.txt #删除不需要的文件
    rm -rf new_date.txt
    rm -rf date.txt
    #根据时间排序删除从第6行开始以后
    # !!!这部可以验证所有待删除的tag,对比harbor仓库是否一致
    NEW_DEL=new1_date.txt
    del_tag=$(cat new1_date.txt | tail -n +6 | awk -F' ' '{print $1}') # 可以查看到所有满足删除需求的
    echo $del_tag
    echo "===========================================" #根据tag执行软删除
    #curl -s -k -X DELETE "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/repositories/${LINE}/tags/${del_tag}"
    done
  3. 基本上整个脚本就结束了,不过这样的删除只是在ui中删除并不是真正意义的删除,还需要执行harbor命令清空Gc才能真正释放资源

    #硬删除,根据自己版本
    #cd ${HARBOR_PAHT} #docker-compose stop
    #docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml
  4. 完整脚本走一波

    #! /bin/bash
    
    HARBOR_PAHT=""
    
    COUNT=$(curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/search?q=项目名称 " |grep "\"tags_count\""|awk -F "\"" '{print $3$4}' | awk -F "" '{print $3$4}')
    
    REPS=$(curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/search?q=项目名称 " |grep "\"repository_name\""|awk -F "\"" '{print $4}')
    for i in $COUNT
    do
    echo $i >> test_count.txt
    done
    for y in $REPS
    do
    echo $y >> test_server.txt
    done paste test_count.txt test_server.txt > count_and_server.txt
    rm -rf test_count.txt
    rm -rf test_server.txt
    rm -rf server.txt FILENAME=count_and_server.txt cat $FILENAME | while read LINE
    do
    new_str=$(echo $LINE | cut -d " " -f1)
    new_str1=$(echo $LINE | cut -d " " -f2)
    if [ $new_str -gt 5 ]
    then
    echo $new_str1 >> server.txt
    fi
    done sed -i 's@\/@%2F@g' server.txt SERVER_NAME=server.txt
    cat $SERVER_NAME | while read LINE
    do name_date=$(curl -s -k -X GET "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/repositories/${LINE}/tags" |egrep "\"created|name\""|awk -F "\"" '{print $4}') for date in $name_date
    do
    echo $date >> date.txt
    done awk '{if(NR%2!=0)ORS=" ";else ORS="\n"}1' date.txt >> new_date.txtawk '{if(NR%2!=0)ORS=" ";else ORS="\n"}1' date.txt >> new_date.txt
    sort -r new_date.txt > new1_date.txt
    rm -rf new_date.txt
    rm -rf date.txt NEW_DEL=new1_date.txt
    del_tag=$(cat new1_date.txt | tail -n +6 | awk -F' ' '{print $1}') curl -s -k -X DELETE "https://${harbor_user}:${harbor_passwd}@${harbor_url}/api/repositories/${LINE}/tags/${del_tag}"
    done cd ${HARBOR_PAHT} docker-compose stop
    docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml #最后启动harbor
    ./install

    有更好方法的欢迎讨论

harbor自动清理镜像的更多相关文章

  1. Harbor 清理镜像(此方法比较粗暴,但是有效)

    0x00 事件 Harbor 私有仓库中占有的存储慢慢越来越大,使用官方的清理工具以及 UI 上的垃圾清理,都似乎也不能清理掉-- 后来吾用了一种简单粗暴的方法清理镜像--删除 harbor regi ...

  2. (十七)VMware Harbor 垃圾清理

    1. 在线垃圾清理 注意:从Harbor中删除镜像时不释放空间,垃圾收集是通过从清单中不再引用文件系统中删除blob来释放空间的任务. 注意:在执行垃圾收集时,Harbor将进入只读模式,并且禁止对d ...

  3. 微服务架构 - 基于Harbor构建本地镜像仓库

    之前写过<搭建docker本地镜像仓库并提供权限校验及UI界面>文章,然后有同仁评论道这样做太复杂了,如果Harbor来搭建会更简单同时功能也更强大.于是抽时间研究了基于Harbor构建本 ...

  4. wordpress自动清理评论回收站

    有时wordpress的垃圾评论实在让人心烦,杂草难除根,footprint吹又生.如果你有心情的话会一个个把垃圾评论放入回收站,但是时间一长,回收站里的东西越堆越多,你可以点击回收站,然后再点一下e ...

  5. 自动清理SQLServerErrorLog错误日志避免太大

    问题描述:开启SQLServer自动备份后,备份文件越来越多,有没有及时清理,导致服务器空间不足,备份出错,以至于出现几个G的ErrorLog文件,影响系统的登录管理. 解决办法:定期清理SQLSer ...

  6. Tomcat8.5.24日志自动清理(maxDays)功能探究

    前言 测试人员反馈tomcat目录下的日志占用空间很大,需要自动清理.接到这个反馈时,想象着应该是一个很简单的功能,tomcat应该已经实现了日志的自动清理功能.于是乎,我先到网上查询了如何自动清除t ...

  7. Docker 删除&清理镜像

    文章首发自个人网站:https://www.exception.site/docker/docker-delete-image 本文中,您将学习 Docker 如何删除及清理镜像? 一.通过标签删除镜 ...

  8. hive 中间会话临时文件自动清理脚本

    hive在运行过程中,我们经常会发现 hdfs /tmp/hive/hive or hdfs 目录占用空间巨大,我这里已经清理过了所以,相对较小.但是初次使用hive的用户,一定会发现 随着时间的推移 ...

  9. zookeeper3.4.6配置实现自动清理日志【转】

    在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存 ...

随机推荐

  1. Gre封装

    在防火墙上连  云时,可以用g0/0/0 在防火墙上不连 云时,一定不用0/0/0 !!!!!!!!! 交换机什么都不配置. FW2: interface GigabitEthernet0/0/0 u ...

  2. 1)PHP,数据库操作类网址

    (1)脚本之家 http://www.jb51.net/article/94347.htm (2)一个博客 http://www.cnblogs.com/lvchenfeng/p/5003629.ht ...

  3. c# winForm 将窗体状态栏StatusStrip 分成左中右三部分 右边显示当前时间

    实现效果:通过StatusStrip显示窗体状态栏同时将状态栏分成三部分居左边显示相关文字信息中间空白显示居右边显示时间信息 1.创建窗体及添加StatusStrip  默认StatusStrip名称 ...

  4. G - 旅行的意义(概率DP) (DAG图的概率与期望)

    为什么有人永远渴望旅行,或许就因为,巧合和温暖会在下一秒蜂拥而至吧. 一直想去旅游的天天决定在即将到来的五一假期中安排一场环游世界的旅行.为此,他已经提前查阅了很多资料,并准备画一张旅游路线图.天天先 ...

  5. 极简配置,业务上云只需 3min

    为了简化账号配置环节,实现本地一键开发部署,Serverless Framework 发布了微信扫码一键登录能力,支持用户在 Serverless Framework 环境扫码注册登陆,用户无需登录控 ...

  6. struts-dojo的使用

    1.导入struts2-dojo-plugin-2.1.8.jar 2.在用使用dojo的页面引入 <span style="font-size:14px;">< ...

  7. OpenCV 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体

    #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #inclu ...

  8. MySQL之数据存储引擎

    1.什么是存储引擎: 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处 理文本用txt类型,处理表格用excel,处理图片用png等,数据库中的表也应该有不同的 ...

  9. spring security梳理

    核心服务:AuthenticationManager,UserDetailsService和AccessDecisionManager The AuthenticationManager, Provi ...

  10. 吴裕雄--天生自然HTML学习笔记:HTML 元素

    HTML 文档由 HTML 元素定义. HTML 元素 开始标签 * 元素内容 结束标签 * <p> 这是一个段落 </p> <a href="default. ...