1. 程式人生 > >批量刪除harbor中的映象

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

五 致謝

     感謝部落格園提供平臺,也感謝我的同事幫助我進行測試和驗證。