前言

自建仓库中目前存在大量已过时不再适用的旧版本服务镜像,不得不做一次镜像大清理。


用脚本清理镜像

下载镜像清理的python脚本

curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null
sudo chmod a+x /usr/local/bin/delete_docker_registry_image

【可选】安装python,如服务器已安装可跳过

  • 直接安装python3
yum install -y python3

设置环境变量

  • 把仓库的v2文件夹绝对路径设置到系统REGISTRY_DATA_DIR环境变量中。
  • 假设设仓库容器名为registry

  • 如果用的是docker部署的,可用docker inspect registry查看具体文件地址,例:

# 运行docker inspect registry,输出存在如下结构体
[root@VM-16-14-opencloudos ~]# docker inspect registry
...
"Mounts": [
{
"Type": "bind",
"Source": "/data/docker-space/docker-registry-deploy/auth",
"Destination": "/auth",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/data/docker-space/docker-registry-deploy/config",
"Destination": "/etc/docker/registry",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/data/docker-space/docker-registry-deploy/data",
"Destination": "/var/lib/registry",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
  • 从上面数据可看出容器中/var/lib/registry目录在宿主机实际位置是/data/docker-space/docker-registry-deploy/data
  • 设置REGISTRY_DATA_DIR环境变量
# export REGISTRY_DATA_DIR=`/data/docker-space/docker-registry-deploy/data`/docker/registry/v2
export REGISTRY_DATA_DIR=/data/docker-space/docker-registry-deploy/data/docker/registry/v2

清理镜像

  • 删除镜像
# image_name为镜像名
python3 delete_docker_registry_image -i ${image_name} -u
  • 执行垃圾回收,清理二进制文件
docker exec -t ${container_name} registry garbage-collect /etc/docker/registry/config.yml

暴力清理指定项目相关的全部景象

该方式清理的时候是按镜像分类清理的

# 进入容器
docker exec -it registry sh
# 进入容器后的操作
# 查看镜像总占用空间
du -sch /var/lib/registry
# 分析镜像层数较多的镜像,仅显示占用前10的镜像名称
registry garbage-collect --dry-run /etc/docker/registry/config.yml | awk -F : '{print $1}' | sort | uniq -c | sort -rn -k1 | head -10 | grep -v "redis\|jdk\|php\|mysql\|nginx\|apache\|zk\|elastic"
# 从上方的输出,酌情考虑哪些镜像需要删除
cd /var/lib/registry/docker/registry/v2/repositories
# 查看当前文件夹目录,可以看到一个个项目的总项目名(镜像名除仓库地址外的第一层级目录)
ls
# 酌情使用rm 删除想要删除的镜像文件夹
# 使用垃圾回收,清理二进制空间
registry garbage-collect /etc/docker/registry/config.yml
# 再次查看占用空间,看清理是否有效果
du -sch /var/lib/registry

参考文章:

https://www.cnblogs.com/xiaojiluben/p/15497837.html