• harbor自动清理镜像


    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="
      "}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="
      "}1' date.txt >> new_date.txtawk '{if(NR%2!=0)ORS=" ";else ORS="
      "}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
      

      有更好方法的欢迎讨论

  • 相关阅读:
    【ThreadLocal】使用ThreadLocal实现线程安全
    【Https】Spring RestTemplete支持Https安全请求
    【MySql】Windows手动注册、启动、数据拷贝
    【技术问题】时空大数据0001---基本知识
    【NodeJS】Vue-d2Admin
    【Oracle】Windows启动
    【三维地质】角点网格
    技术总结
    【Sqlite】C#不同支持
    【Java】Spring
  • 原文地址:https://www.cnblogs.com/only-me/p/12416369.html
Copyright © 2020-2023  润新知