docker registry镜像清理

本文介绍了如何通过脚本自动化管理Docker Registry,当磁盘空间低于20GB时执行清理操作。脚本包括清理仓库中的镜像,设置删除配置,以及删除指定应用的旧版本标签,以释放磁盘空间。同时提供了停止并移除仓库的脚本,以备不时之需。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值