Docker Registry之删除image

1、假设你已经部署好了rejistry,并成功推送镜像且可以拉取

需要服务器先安装curl 7.58.0 和awk 4.1.4,且已经推送testapi.api:20210510101619 image

修改registry可删除,如果创建的时候没有设置的话,使用下面的命令,复制到本地

docker cp registry:/etc/docker/registry/config.yml .

修改config.yml增加节点

storage:
	delete:
		enabled: true

复制到容器中,并重启容器

docker cp config.yml registry:/etc/docker/registry/config.yml

docker restart registry

获取卷

root@ubuntu:/home/ubuntu# curl -u test:123456 --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -Is  https://sita.site:5000/v2/testapi.api/manifests/20210510101619 | awk '/digest/ {print $NF}'
sha256:296b7fc0ae135ba3786cead98a155210e305e0c7a01f489228e96bbfbe7edce4
root@zorroubuntu:/home/zorro#

返回 sha256:296b7fc0ae135ba3786cead98a155210e305e0c7a01f489228e96bbfbe7edce4放到下面命令中

2,删除

curl -Is -u zorro:123456 -X DELETE https://sita.site:5000/v2/testapi.api/manifests/296b7fc0ae135ba3786cead98a155210e305e0c7a01f489228e96bbfbe7edce4 | awk '/HTTP/ {print $2}')

这样就能成功删除了

3,使用脚本删除

创建cleanRegistry.sh,适用ubuntu 18+

#!/bin/bash

# ubuntu 18,docker v20 ,registry v2.7.1
# Docker registry 私有仓库镜像查询、删除、上传、下载

# 参数 variable
# image="image_name:image_version"

# registry容器名称,默认registry
registry_name="registry"
#registry_name=${registry_name:-registry}

# 访问仓库地址:xx.xx.xx.xx:443
registry_url="https://sita.site:5000"

# auth 认证用户名密码
auth_user="zorro"
auth_passwd="123456"

# Script run root
if [[ $UID -ne 0 ]]; then
   echo "This script must be run as root."
   exit 1
fi

# Command-line JSON processor
if [[ ! -f /usr/bin/jq ]]; then
  echo "Install jq"
  apt -y install jq > /dev/null 2>&1
fi

# 检测仓库的可用性
function check_registry() {
  curl -s -u ${auth_user}:${auth_passwd} ${registry_url}/v2/_catalog > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    echo -e "Connect to registry server ${registry_url} successfully!"
  else
    echo -e "Connect to registry server ${registry_url} failed!"
    exit 1
  fi
}

# 获取镜像和对应版本名列表
function fetch_image_name_version() {
  image_name_list=$(curl -s -u ${auth_user}:${auth_passwd} ${registry_url}/v2/_catalog | jq .repositories | awk -F'"' '{for(i=1;i<=NF;i+=2)$i=""}{print $0}')
  if [[ ${image_name_list} = "" ]]; then
    echo -e "No image found in ${registry_url}!"
    exit 1
  fi

  for image_name in ${image_name_list};
    do
      image_version_list=$(curl -s -u ${auth_user}:${auth_passwd} ${registry_url}/v2/$image_name/tags/list | jq .tags | awk -F'"' '{for(i=1;i<=NF;i+=2)$i=""}{print $0}')
      for t in $image_version_list;
      do
        echo "${image_name}:${t}"
      done
    done
}

# 删除镜像
function delete_image() {
  for n in ${images};
  do
    image_name=${n%%:*}
    image_version=${n##*:}
    i=1
    [[ "${image_name}" == "${image_version}" ]] && { image_version=latest; n="$n:latest"; }

    image_digest=`curl -u ${auth_user}:${auth_passwd} --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -Is  ${registry_url}/v2/${image_name}/manifests/${image_version} | awk '/digest/ {print $NF}'`
    echo "$image_digest"
    if [[ -z "${image_digest}" ]]; then
      echo -e "${image_name}:${image_version} does no exist!"
    else
      digest_url="${registry_url}/v2/${image_name}/manifests/${image_digest}"
      return_code=$(curl -Is -u ${auth_user}:${auth_passwd} -X DELETE ${digest_url%?} | awk '/HTTP/ {print $2}')
      if [[ ${return_code} -eq 202 ]]; then
        echo "Delete $n successfully!"
        let i++
      else
        echo -e "Delete $n failed!"
      fi
    fi
  done
# registry垃圾回收
   if [[ "$i" -gt 1 ]]; then
     echo "Clean..."
     docker exec ${registry_name} registry garbage-collect /etc/docker/registry/config.yml
     docker restart ${registry_name}
     #systemctl restart ${registry_name}
   fi
}

# 删除同仓库中一个镜像的所有版本
function delete_all_image() {
  [[ -f /usr/bin/docker ]] || echo "No docker client found."
  [[ -z $(docker ps |awk '/'${registry_name}'/ {print $NF}') ]] && { echo "${registry_name} container does no exist.";exit; }
  for n in ${images};
  do
    image_name="${n%%:*}"
    docker exec ${registry_name} rm -rf /var/lib/registry/docker/registry/v2/repositories/${image_name}
  done

  echo "Clean..."
  docker exec ${registry_name} registry garbage-collect /etc/docker/registry/config.yml
  docker restart ${registry_name}
  #systemctl restart ${registry_name}
}

case "$1" in
  "-h")
  echo
  echo "#默认查询所有 镜像名:版本号"
  echo "sh $0 -h                                                           #帮助"
  echo "sh $0 -d image_name1:image_version1 image_name2_image_version2     #删除"
  echo "sh $0 -dd  image_name                                              #清理"
  echo
  echo "#示例:删除 centos:6 centos:7 (镜像名:版本)"
  echo "sh $0 -d centos:6  centos:7"
  echo "#示例:删除centos所有版本"
  echo "sh $0 -dd centos"
  echo
;;
  "-d")
  check_registry
  images=${*/-dd/}
  images=${images/-d/}
  delete_image
;;
  "-dd")
  check_registry
  images=${*/-dd/}
  images=${images/-d/}
  delete_all_image
;;
  "-q")
  check_registry
  fetch_image_name_version
;;
  *)
  echo "Error command"
;;
esac

*记得修改为自己的仓库链接和用户密码

registry_url="https://sita.site:5000"
auth_user="test"
auth_passwd="123456"

脚本来源于网络,稍微修改了一些

在脚本所在文件夹执行

bash cleanRegistry.sh -d testapi.api:20220510101619
Connect to registry server https://d.sita.site:5000 successfully!
sha256:296b7fc0ae135ba3786cead98a155210e305e0c7a01f489228e96bbfbe7edce4
Delete testapi.api:20220510101619 successfully!

这样就删除成功了,动手能力强的小伙伴可以使用python 封装成api,方便调用

4,有时候会有异常,导致删除不掉,那么可以直接删除文件再执行清理

我创建的registry时候指定的存储位置是/opt/data/registry/docker/registry/v2/repositories/

进入这个路面就能看下所有仓储了,直接删除就行了

root@buntu:/opt/data/registry/docker/registry/v2/repositories# ll
total 16
drwxrwxrwx 4 root root 4096 May 10 18:25 ./
drwxr-xr-x 4 root root 4096 Apr 29 11:19 ../
drwxr-xr-x 3 root root 4096 May  9 12:48 dotnet/
drwxr-xr-x 5 root root 4096 May 10 18:25 testapi.api/
root@buntu:/opt/data/registry/docker/registry/v2/repositories# rm -r testapi.api

更多信息请查看 博客 或者关注公众号:Z技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值