chowhua

导航

批量删除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

五 致谢

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

posted on 2018-12-16 12:31  chowhua  阅读(3675)  评论(0编辑  收藏  举报