一 說明python
這個是我第一篇博客,因此我想放上原創的東西,儘管我一直都很擔憂本身寫得太low,可是總要學會嘗試,學會改變本身,相信本身。在寫這個腳本時,因爲我接觸LInux不是不少,能力有限,僅僅是爲了讓本身心情好點,能夠說只是爲了完成任務,並無考慮其中好比代碼重複,註釋不完整等諸多問題。這是9月份作的事情了,由於各類緣由,後續也沒去關注腳本中問題。請多多包含。git
二 背景github
公司最近在搞關於k8s的東西,我也跟着參與進去了。在學習和使用了一段時間以後,發現Habor中的鏡像愈來愈多,由於咱們是採用以當前時間做爲鏡像的標籤,因此幾個月以後,發現磁盤容量剩餘很少了,決定要刪除以前的一些已經肯定不會再使用的鏡像。因而,我就手動刪除了最先一個月的鏡像,結果搞得我很不爽,這樣子太慢了,太消耗時間了。因而想,經過腳本刪除豈不是更好麼?這樣子很快的就可以刪除那些沒用的鏡像了,免得我心煩。後來網上找了一下,發現並無相似的腳本之類的。因而,決定根據官網所提供的接口本身來寫一個腳本。當時在瞭解了以後,決定用shell,python也是能夠的 ,不過我還在學習的路上。因此決定先用shell,後學學成再改到用python。在此過程當中,很是感謝個人一個同事陪我一塊兒進行了測試和驗證。docker
三 具體思路shell
首先,咱們的harbor中的項目都是公有的,harbor的訪問時經過域名,採用https,鏡像以當前時間爲標籤,好比201810121420 201807081234。執行刪除腳本時,先告訴你目前harbor下有那些項目,讓你選擇項目,根據你選擇的項目去查詢它下面有哪些倉庫,讓你輸入倉庫,再去查詢其下面有哪幾種鏡像格式,如10月的鏡像格式爲201810;再根據你輸入的鏡像格式去刪除以鏡像格式刪除的鏡像,就是若是你選擇201810,則2018年10月的全部鏡像都會被刪除,最後告知你刪除了多少個鏡像。腳本執行後,磁盤空間並不會釋放,仍是須要中止Harbor進行回收。json
四 腳本內容api
腳本我放在了github上,地址:https://github.com/zhouhua-amei/dockerbash
#! /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
五 致謝app
感謝博客園提供平臺,也感謝個人同事幫助我進行測試和驗證。curl