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"
脚本来源于Github,稍微修改了一些
在脚本所在文件夹执行
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
更多信息请查看