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