在Linux主機使用命令行批量刪除harbor鏡像
腳本使用說明:
- 此腳本不是萬能腳本,根據自身環境要調整很多
- 能用harbor的域名就不要用IP
- 腳本前半部分可以套用,后半部分需一步一步試錯,結合自己的環境
- 參考文檔為:https://www.cnblogs.com/xiyangxixi/p/10126106.html 感謝原文作者貢獻
#! /bin/bash
# 通過Harbor提供的API來批量刪除鏡像,人工刪除費時費力
# 經過測試發現,通過接口去刪除時提供的是的標簽,但實際上刪除的時候通過的是鏡像的IMAGE_ID,也就是說
# 如果我把同一個鏡像tag多次上傳到harbor,通過借口刪除時,只需要提供其中一個標簽,那么和這個鏡像的IMAGE_ID相同的鏡像都會刪除
USERANDPASS="admin:12345}A"
ADDRESS="lulala.papa.com:1180"
#### 項目個數
lines=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/projects?" |grep "\"name\""|awk -F "\"" '{print $4}'|wc -l`
##### 展示當前有幾個項目
echo "當前Harbor有以下幾個項目:"
for i in $(seq 1 $lines)
do
###########具體是啥項目
a=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/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 "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/projects?" |grep "\"name\""|awk -F "\"" '{print $4}'|awk -v b=$number 'NR==b{print $1}'`
#####多少個倉庫
d=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/projects?" |grep "$c" -C 2 |grep "project_id" |awk '{print $2}' |awk -F "," '{print $1}'`
#echo "\$d-----------$d"
######顯示倉庫個數
## e=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/repositories?project_id=$d" | grep "\"name\"" |awk -F "\"" '{print $4}' |awk -F "/" '{print $2}'|wc -l`
e=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/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 "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/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 "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/repositories?project_id=$d" | grep "\"name\"" |awk -F "\"" '{print $4}' |sed 's/sc\///g'|awk -v g=$num 'NR==g{print $1}' | awk -F "/" '{print $2}'`
echo "您選擇的倉庫是$h"
#### 標簽類型種類個數
# i=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}' | cut -c -6 |sort -n |uniq|wc -l`
# echo $i
#### 標簽類型以及個數
echo "##################################"
echo "鏡像格式為:dev或者是qa"
echo "##################################"
#####每種鏡像格式以及其數量
#curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/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 "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}'|grep $image_format|awk '{print $1}' | sed 's/\(.*\)-\(.*\)/\2/g' | sort -n | awk 'NR!=1 {print image_format"-"$1}' image_format="$image_format"`
#########統計鏡像個數
#count_image=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}'|grep $image_format|wc -l`
COUNTA=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}'|grep $image_format|awk '{print $1}' | sed 's/\(.*\)-\(.*\)/\2/g' | sort -n | awk 'NR!=1 {print image_format"-"$1}' image_format="$image_format"| wc -l`
COUNTB=10
COUNTC=`expr ${COUNTA} - ${COUNTB} | bc`
imagesA=`curl -s -u "$USERANDPASS" -X GET -H "Content-Type: application/json" "https://$ADDRESS/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}'|grep $image_format|awk '{print $1}' | sed 's/\(.*\)-\(.*\)/\2/g' | sort -n | awk 'NR!=1 {print image_format"-"$1}' image_format="$image_format" | head -${COUNTC}`
for image_label in $imagesA
do
#############執行刪除
curl -u "$USERANDPASS" -X DELETE -H "Content-Type: application/json" "https://$ADDRESS/api/repositories/$c%2F$h/tags/$image_label"
done
if [ $? -eq 0 ]
then
echo "刪除成功"
fi
fi
fi
