1. 程式人生 > 實用技巧 >Docker registry cli 私有倉庫映象查詢、刪除、上傳、下載 shell

Docker registry cli 私有倉庫映象查詢、刪除、上傳、下載 shell

#Docker官方私有倉庫registry
#官方只提供了API介面,不方便使用,就寫了個shell
#docker-registry安裝配置http://www.cnblogs.com/elvi/p/8384604.html

#使用:
#複製程式碼儲存為img_registry.sh
sh img_registry.sh -h #檢視幫助

#HUB=hub.test.com:5000 改為自己的地址

#shell程式碼 git地址https://gitee.com/almi/docker/blob/master/0.Shell/img_registry.sh

#!/bin/bash
#cnetos7,docker-ce v17.12.0,registry v2.6.2
#Docker registry 私有倉庫映象查詢、刪除、上傳、下載

#Author  Elven <[email protected]>
#Blog    http://www.cnblogs.com/elvi/p/8384675.html

#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:-registry}
#訪問網址,預設localhost:5000
HUB=${HUB:-localhost:5000}
HUB=hub.test.com:5000

#檢測 check
function Check_hub() {
[[ `curl -s $HUB/v2/_catalog` == "Failed connect" ]] && { echo -e "\033[31m$HUB 訪問失敗\033[0m";exit;  }
}

#查詢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
  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
}

#刪除images
function Delete_img() {
for n in $IMGS;
do
  IMG=${n%%:*}
  TAG=${n##*:}
  i=1
  [[ "$IMG" == "$TAG" ]] && { TAG=latest; n="$n:latest"; }
  Digest=`curl  --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -Is  ${HUB}/v2/${IMG}/manifests/${TAG} |awk '/Digest/ {print $NF}'`
  [[ -z "$Digest" ]] && { echo -e "\033[31m$IMG:$TAG  映象不存在\033[0m";} || { 
    URL="${HUB}/v2/${IMG}/manifests/${Digest}"
    Rs=$(curl -Is -X DELETE ${URL%?}|awk '/HTTP/ {print $2}')
    [[ $Rs -eq 202 ]] && { let i++;echo "$n  刪除成功"; } || { echo -e "\033[31m$n  刪除失敗\033[0m"; } }
done
#registry垃圾回收 RN=registry
[[ "$i" -gt 1 ]] && { echo "Clean...";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
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
}

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/}
  IMGS=${IMGS/-d/}
  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