之前基于docker部署了一套harbor服务,存储配置一般,因此在使用harbor的时候,经常会出现空间满了,需要删除镜像,harbor管理页面上提供了删除的功能,有时候操作起来也不是很方便(比如批量删除多个仓库的精镜像),我在这里实现了通过脚本删除的工具。
镜像删除原理
在镜像删除之前,说明一下删除镜像的基本原理,如果需要批量删除某个镜像仓库,基本逻辑如下:
- 获取所有镜像仓库列表;
- 获取镜像仓库;
- 获取仓库标签列表;
- 根据标签获取镜像的digest;
- 根据digest删除镜像;
- 垃圾清理。
对于其他情况,只需要组合以上6个步骤中的某几个即可
先来实现每个步骤的脚本
- 环境准备:本实验环境在centos7操作系统及以上版本(假设docker harbor已安装);
- 需要安装jq(json数据处理工具),curl,命令工具;
获取运行环境的关键信息
CID=docker ps | grep harbor-registry | awk '{print $1}'
HUB=localhost:5000
IMAGES=’’
- 查询docker 镜像
function find_images(){
IMAGES=`curl -s $HUB/v2/catalog | jq .repositories | awk -f "[\"\" '{print $2}'`
for image in IMAGES;
do
tags=`curl -s http://$HUB/v2/$image/tags/list | jq .tags | awk -f "[\"\" '{print $2}'`
for tag in tags;
do
echo "$image:$tag"
done
done
}
- 删除镜像
function delete_image(){
for image in $IMAGES;
do
name=${image%%:*}
tag=${n##*:}
i=1
[[ "$name" == "$tag" ]] && { tag=latest; name=“$name:latest” }
digest=`curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -Is $HUB、v2/$image/manifests/$tag | awk '/Digest/ {print $NF}'`
[[ -z "$Digest" ]] && {echo -e "$name not found! ";} || {
URL="$HUB/v2/$image/manifests/$digest"
rs=`curl -Is -X DELETE $URL | awk '/HTTP/ {print $2}'
[[ $rs -eq 202 ]] && { let i++; echo "$image delete succes"} || { echo -e "images delete failure";}
}
done
}
- 垃圾清理
function garbage_collect(){
echo "garbage collector...";
docker exec $CID /user/bin/registry garbage-collect /etc/docker/registry/config.yml
docker restart $CID;
echo "garbage collector finished."
}
核心脚本已完成,现实中根据实际情况组合或者调整以上脚本的逻辑即可完成清理工作,下面给出一个删除所有镜像的demo脚本
echo "bein clear harbor registry storage...."
find_images
delete_image
garbage_collect
echo "bein clear harbor registry finished."