zoukankan      html  css  js  c++  java
  • 批量删除harbor中的镜像

    一 说明

         这个是我第一篇博客,所以我想放上原创的东西,尽管我一直都很担心自己写得太low,但是总要学会尝试,学会改变自己,相信自己。在写这个脚本时,由于我接触LInux不是很多,能力有限,仅仅是为了让自己心情好点,可以说只是为了完成任务,并没有考虑其中比如代码重复,注释不完整等诸多问题。这是9月份做的事情了,因为各种原因,后续也没去关注脚本中问题。请多多包含。

    二 背景

         公司最近在搞关于k8s的东西,我也跟着参与进去了。在学习和使用了一段时间之后,发现Habor中的镜像越来越多,因为我们是采用以当前时间作为镜像的标签,所以几个月之后,发现磁盘容量剩余不多了,决定要删除之前的一些已经确定不会再使用的镜像。于是,我就手动删除了最早一个月的镜像,结果搞得我很不爽,这样子太慢了,太消耗时间了。于是想,通过脚本删除岂不是更好么?这样子很快的就能够删除那些没用的镜像了,省得我心烦。后来网上找了一下,发现并没有类似的脚本之类的。于是,决定根据官网所提供的接口自己来写一个脚本。当时在了解了之后,决定用shell,python也是可以的 ,不过我还在学习的路上。所以决定先用shell,后学学成再改到用python。在此过程中,非常感谢我的一个同事陪我一起进行了测试和验证。

    三 具体思路

         首先,我们的harbor中的项目都是公有的,harbor的访问时通过域名,采用https,镜像以当前时间为标签,比如201810121420 201807081234。执行删除脚本时,先告诉你目前harbor下有那些项目,让你选择项目,根据你选择的项目去查询它下面有哪些仓库,让你输入仓库,再去查询其下面有哪几种镜像格式,如10月的镜像格式为201810;再根据你输入的镜像格式去删除以镜像格式删除的镜像,就是如果你选择201810,则2018年10月的所有镜像都会被删除,最后告知你删除了多少个镜像。脚本执行后,磁盘空间并不会释放,还是需要停止Harbor进行回收。

    四 脚本内容

         脚本我放在了github上,地址:https://github.com/zhouhua-amei/docker

    #! /bin/bash
    # 通过Harbor提供的API来批量删除镜像,人工删除费时费力
    # 经过测试发现,通过接口去删除时提供的是的标签,但实际上删除的时候通过的是镜像的IMAGE_ID,也就是说
    # 如果我把同一个镜像tag多次上传到harbor,通过借口删除时,只需要提供其中一个标签,那么和这个镜像的IMAGE_ID相同的镜像都会删除
    
    
    #### 项目个数
    lines=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep ""name""|awk -F """ '{print $4}'|wc -l`
    ##### 展示当前有几个项目
    echo "当前Harbor有以下几个项目:"
    for i in $(seq 1 $lines)
    do
       ###########具体是啥项目
       a=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep ""name""|awk -F """ '{print $4}'|awk -v b=$i 'NR==b{print $1}'`
       echo $i、$a
    done
    #######选择具体的项目
    read -p  "请输入序号(1~$lines):,查看其下的镜像仓库:" number
    if [ $number -ge 1 -a $number -le $lines ]
    then
     #########选择的是哪个项目
     c=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep ""name""|awk -F """ '{print $4}'|awk -v b=$number 'NR==b{print $1}'`
    #####多少个仓库
      d=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep "$c" -C 2 |grep "project_id" |awk '{print $2}' |awk -F "," '{print $1}'`
      #echo "$d-----------$d"
    ######显示仓库个数
     ## e=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=$d" | grep ""name"" |awk -F """ '{print $4}' |awk -F "/" '{print $2}'|wc -l`
    e=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=2" | grep ""name"" |awk -F """ '{print $4}' |sed 's/sc///g'|wc -l`
     ####### 简单展示
      echo "项目$c下有以下镜像仓库:"
      for line in $(seq 1 $e)
      do
       #####具体的仓库名
        f=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=$d" | grep ""name"" |awk -F """ '{print $4}' |sed 's/sc///g'|awk -v g=$line 'NR==g{print $1}'`
        echo $line、$f
      done
       read -p  "请输入序号(1~$e):,查看其下的镜像格式以及对应的数量:" num
       if [ $num -ge 1 -a $num -le $e ]
       then
      #### 镜像仓库名字
         h=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=$d" | grep ""name"" |awk -F """ '{print $4}' |sed 's/sc///g'|awk -v g=$num 'NR==g{print $1}'`
         echo "您选择的仓库是$h"
      #### 标签类型种类个数
    #     i=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep ""name"" |awk -F""" '{print $4}' | cut -c -6 |sort -n |uniq|wc -l`
        # echo $i
     #### 标签类型以及个数
        echo "##################################"
        echo "镜像格式为:如果是10月,则为201810*"
        echo "##################################"
        #####每种镜像格式以及其数量
        curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep ""name"" |awk -F""" '{print $4}' | cut -c -6 |awk '{count[$1]++}END{for (i in count)print i,count[i]}'
     ######输入镜像格式,进行删除
         echo "如果想删除某种形式的镜像,请输入类型:"
         read image_format
         ##########输入类型的所有镜像
         images=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep ""name"" |awk -F""" '{print $4}'|grep $image_format|awk '{print $1}'`
         #########统计镜像个数
        count_image=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep ""name"" |awk -F""" '{print $4}'|grep $image_format|wc -l`
        for image_label in $images
        do
        #############执行删除
          curl -u "admin:Harbor12345" -X DELETE -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/$image_label"
        done
          if [ $? -eq 0 ]
          then
            echo "删除成功"
            echo "本次共删除$count_image个镜像"
          fi
     fi
    fi
    

    五 致谢

         感谢博客园提供平台,也感谢我的同事帮助我进行测试和验证。

  • 相关阅读:
    javascript数据类型判断
    Week04面向对象设计与继承
    201621044079《Java程序设计》第1周学习总结
    201621044079 week05继承、多态、抽象类与接口
    201621044079《Java程序设计》第二周学习总结
    Week03面向对象入门
    201621044079WEEK06接口、内部类
    202020211 20209320 《Linux内核原理与分析》第一周作业
    第二天:PowerShell别名
    第一天:powershell外部命令
  • 原文地址:https://www.cnblogs.com/xiyangxixi/p/10126106.html
Copyright © 2011-2022 走看看