清理Registry私有倉庫中不需要的鏡像
背景
在私有registry倉庫的使用場景中,隨着業務版本迭代,會頻繁更新私有鏡像版本。在升級完私有鏡像版本之后,老版本的鏡像就不再使用,但是它依然存在於私有鏡像倉庫中,隨着老版本鏡像越來越多,會占用大量的磁盤空間。因此,我們需要對其進行清理。
方式一:手動執行命令清理
操作步驟:
需注意修改用戶名、密碼、IP、端口以及鏡像名
1、查看倉庫中的鏡像信息:
curl -u user:password -X GET http://ip:port/v2/_catalog
2、根據鏡像名獲取tag列表:
curl -u user:password -X GET http://ip:port/v2/imageName/tags/list
3、獲取digest_hash參數:
curl -u user:password --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://ip:port/v2/imageName/manifests/v1.0
4、根據某個sha刪除:
curl -u user:password -I -X DELETE http://ip:port/v2/imagesName/manifests/sha256:47e63235ef41ece989ddf2f4001d458c5935f5c1ae5c5a5f9b01
5、registry垃圾回收:
docker exec registry1 registry garbage-collect /etc/docker/registry/config.yml
方式二:使用腳本清理
使用說明:
示例:刪除 nginx:1.1 nginx:1.2 (鏡像名:版本)
sh $0 -d nginx:1.1 nginx:1.2
sh $0 -dd nginx #刪除nginx所有版本
更多使用方法,可以使用以下命令查看幫助文檔:
sh 腳本名 -h
腳本
#!/bin/bash
#cnetos7,docker-ce v18.09.9,registry v2.6.2
#Docker registry 私有倉庫鏡像查詢、刪除、上傳、下載
#root
[[ $UID -ne 0 ]] && { echo "Run in root user !";exit; }
#need jq ,get json data
[[ -f /usr/bin/jq ]] || { echo 'install jq';yum install -y jq &>/dev/null; }
#參數 variable
#registry容器名稱,默認registry
RN=${RN:-registry1}
#訪問網址,默認localhost:5000
HUB=${HUB:-localhost:5000}
HUB=192.168.89.11:5000
# 檢測 check
function Check_hub() {
[[ `curl -u admin:admin -s $HUB/v2/_catalog` == "Failed connect" ]] && { echo -e "\033[31m$HUB 訪問失敗\033[0m";exit; }
}
# 刪除images
function Delete_img() {
for n in $IMGS;
do
IMG=${n%%:*}
TAG=${n##*:}
echo "IMG=${IMG}"
echo "TAG=${TAG}"
i=1
[[ "$IMG" == "$TAG" ]] && { TAG=latest; n="$n:latest"; }
Digest=`curl -u admin:admin --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -Is ${HUB}/v2/${IMG}/manifests/${TAG} |awk '/Digest/ {print $NF}'`
echo "Digest=${Digest}"
[[ -z "$Digest" ]] && { echo -e "\033[31m$IMG:$TAG 鏡像不存在\033[0m";} || {
URL="${HUB}/v2/${IMG}/manifests/${Digest}"
echo "URL=${URL}"
Rs=$(curl -u admin:admin -Is -X DELETE ${URL%?}|awk '/HTTP/ {print $2}')
echo "Rs=${Rs}"
[[ $Rs -eq 202 ]] && { let i++;echo "$n 刪除成功"; } || { echo -e "\033[31m$n 刪除失敗\033[0m"; }
}
done
#registry垃圾回收
RN=ips_registry1
[[ "$i" -gt 1 ]] && {
echo "Clean...執行docker exec";
docker exec ${RN} /bin/registry garbage-collect /etc/docker/registry/config.yml &>/dev/null;
docker restart ${RN} &>/dev/null;
}
}
# 刪除鏡像所在目錄(清除所有 -dd .* )
# 簡單高效,刪庫跑路,必備技能
function Delete_img_a() {
[[ -f /usr/bin/docker ]] || echo 'No docker !'
[[ -z $(docker ps |awk '/'$RN'/ {print $NF}') ]] && { echo "$RN容器不存在!";exit; }
for n in $IMGS;
do
IMG="${n%%:*}"
docker exec $RN rm -rf /var/lib/registry/docker/registry/v2/repositories/$IMG
echo "$IMG 刪除成功"
done
echo '清理 Clean ...'
docker exec $RN bin/registry garbage-collect /etc/docker/registry/config.yml &>/dev/null
docker restart $RN &>/dev/null
}
# 上傳 push
function Push() {
for IMG in $IMGS;
do
echo -e "\033[33m docker push $IMG to $HUB \033[0m"
docker tag $IMG $HUB/$IMG
docker push $HUB/$IMG
docker rmi $HUB/$IMG &>/dev/null
done
}
# 下載 pull
function Pull() {
for IMG in $IMGS;
do
echo -e "\033[33m dokcer pull $IMG from $HUB \033[0m"
docker pull $HUB/$IMG
docker tag $HUB/$IMG $IMG
docker rmi $HUB/$IMG &>/dev/null
done
}
# 查詢images
function Select_img() {
IMG=$(curl -s $HUB/v2/_catalog |jq .repositories |awk -F'"' '{for(i=1;i<=NF;i+=2)$i=""}{print $0}')
[[ $IMG = "" ]] && { echo -e "\033[31m$HUB 沒有docker鏡像\033[0m";exit; }
#echo "$HUB Docker鏡像:"
for n in $IMG;
do
echo "*****************【$n】******************"
TAG=$(curl -s http://$HUB/v2/$n/tags/list |jq .tags |awk -F'"' '{for(i=1;i<=NF;i+=2)$i=""}{print $0}')
for t in $TAG;
do
echo "$n:$t";
done
done
}
case "$1" in
"-h")
echo
echo "#默認查詢images"
echo "sh $0 -h #幫助 -d #刪除 -dd #清理空間"
echo " -pull img1 img2 #下載 -push #上傳"
echo
echo "#示例:刪除 nginx:1.1 nginx:1.2 (鏡像名:版本)"
echo "sh $0 -d nginx:1.1 nginx:1.2 "
echo "sh $0 -dd nginx #刪除nginx所有版本"
echo
echo "#定義倉庫url地址hub.test.com:5000(默認 localhost:5000)"
echo "env HUB=hub.test.com:5000 /bin/sh $0 -d nginx:1.1 "
echo
;;
"-d")
Check_hub
IMGS=${*/-dd/}
echo "IMGS=${IMGS}"
IMGS=${IMGS/-d/}
echo "IMGS=${IMGS}"
Delete_img
;;
"-dd")
Check_hub
IMGS=${*/-dd/}
IMGS=${IMGS/-d/}
Delete_img_a
;;
"-pull")
IMGS=${*/-pull/}
Pull
;;
"-push")
IMGS=${*/-push/}
Push
;;
*)
Check_hub
Select_img
;;
esac