docker registry创建后,如果一直使用的话会最终会出现占用磁盘空间过多的问题。这时候就需要清除docker镜像,创建私有仓库的PC上一般本地存在docker镜像,仓库中还有一份,所以都需要删除。以下是笔者实验后得出的使用脚本清理的方式,写了个脚本来实现,当磁盘空间小于20G的时候进行清理,在此做过记录。
1.清除仓库中的镜像文件
#!/bin/bash
set -e
df_lines=$(df -P | wc -l)
max_siz=0
for i in $(seq 2 $df_lines)
do
mount_point=$(df -P | awk -v i=$i 'NR==i{print $6}')
if [[ $mount_point = / ]]; then
temp_siz=$(df -P | awk -v i=$i 'NR==i{print $2}')
if [ $temp_siz -gt $max_siz ];then
max_siz=$temp_siz
echo $mount_point
avail=$(df -P | awk -v i=$i 'NR==i{print $4}')
break
fi
fi
done
echo "系统剩余空间:$avail"
thresh_20G=20971520
if [ $avail -lt $thresh_20G ];then
echo "磁盘空间小于20G,开始清理磁盘空间..."
img_num=$(docker images -q | wc -l)
echo $img_num
if [ $img_num -lt 2 ]; then
echo "可能是系统中其他地方占用了磁盘空间,请手动清除!"
exit
fi
registry_img=$(docker images | grep "registry" | awk '{print $3}')
echo $registry_img
docker rmi -f $(docker images -q | uniq | grep -v $registry_img)
result=$(docker exec -it registry sh -c 'cat /etc/docker/registry/config.yml' | grep "delete")
echo $result
if [[ -n ${result} ]]; then
echo "have set delete configure."
else
echo "start set delete configure."
#config delete: enabled: true
docker exec -it registry sh -c "sed -i '/storage:/a\ delete:' /etc/docker/registry/config.yml"
docker exec -it registry sh -c "sed -i '/delete:/a\ enabled: true' /etc/docker/registry/config.yml"
#restart registry
docker restart registry
fi
#xxx-release是docker名称
xxx_release_tags=$(curl http://127.0.0.1:5000/v2/xxx-release/tags/list)
echo $xxx_release_tags > /tmp/tags.txt
sed -i 's/{\"name\":\"xxx-release\",\"tags\"\:\[//' /tmp/tags.txt
sed -i 's/]}//' /tmp/tags.txt
sed -i 's/"//g' /tmp/tags.txt
xxx_release_tags=$(cat /tmp/tags.txt)
ifs_old=$IFS
IFS=$','
for tag in $(echo "${xxx_release_tags}")
do
echo "${tag}"
#1.xxx-release
echo "##delete xxx-release"
digest=$(curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://127.0.0.1:5000/v2/xxx-release/manifests/${tag} | grep Docker-Content-Digest | sed -e 's/Docker-Content-Digest: //g')
digest=$(echo $digest|sed 's/\r//g')
echo ${digest}
curl -I -X DELETE http://127.0.0.1:5000/v2/xxx-release/manifests/${digest}
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
echo "磁盘空间清理完毕!"
done
else
echo "磁盘剩余空间大于20G,不需要做清除!"
exit
fi
2.拆除仓库,使用的时候再创建仓库
#!/bin/bash
set -e
df_lines=$(df -P | wc -l)
max_siz=0
for i in $(seq 2 $df_lines)
do
mount_point=$(df -P | awk -v i=$i 'NR==i{print $6}')
if [[ $mount_point = / ]]; then
temp_siz=$(df -P | awk -v i=$i 'NR==i{print $2}')
if [ $temp_siz -gt $max_siz ];then
max_siz=$temp_siz
echo $mount_point
avail=$(df -P | awk -v i=$i 'NR==i{print $4}')
break
fi
fi
done
echo "系统剩余空间:$avail"
thresh_20G=20971520
if [ $avail -lt $thresh_20G ];then
echo -n '请确认是否清理磁盘空间(y/n):'
read ifclean
if [[ $ifclean == "y" ]] ;then
echo "磁盘空间小于20G,开始清理磁盘空间..."
img_num=$(docker images -q | wc -l)
echo $img_num
if [ $img_num -lt 2 ]; then
echo "可能是系统中其他地方占用了磁盘空间,请手动清除!"
exit
fi
echo "stop all containers"
docker stop $(docker ps -q)
echo "clean all docker images"
docker rmi -f $(docker images -q | uniq)
#笔者创建的registry对应的本地路径为/opt/registry,如果和笔者不同的请自行修改
sudo rm -rf /opt/registry
echo "磁盘空间清理完毕!"
sudo systemctl daemon-reload
sudo systemctl restart docker
fi
else
echo "磁盘剩余空间大于20G,不需要做清除!"
exit
fi