天天看點

docker registry鏡像清理

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