距离上一次更新该文章已经过了 689 天,文章所描述的內容可能已经发生变化,请留意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #!/usr/bin/env bash #删除过期镜像,保留最新${retain}个版本(需要确保版本号确实是越新的越大) retain=1 cdate=$(date '+%Y-%m-%d_%H:%M:%S') # 镜像中的关键字 keyword="docker.io" # 先删除异常停止的docker容器 docker rm -f $(docker ps -a | grep Exited | awk '{print $1}') # 先删除名称或标签为none的镜像 docker rmi -f $(docker images | grep '<none>' | awk '{print $3}') for service in $(docker images | grep "${keyword}" | awk '{print $1}') do # 查看当前服务有多少镜像 count=$(docker images | grep -c "$service") # 如果当前服务的镜像数大于保留数,则进行删除 if [[ $count -gt $retain ]];then # 当modifyCount=count-retain则停止删除镜像 modifyCount=0 # tag的分割符"v",然后取后面的数字进行正序排序(screw-db:v100) for i in $(docker images | grep "$service" | awk '{print $2}' | awk -F'v' '{print $2}' | sort -u) do # 当modifyCount=count-retain则停止删除镜像 if [ $modifyCount -eq $(( count - retain )) ]; then break fi # 拼接版本: v100 version=$(docker images | grep "$service" | awk '{print $2}' | grep "$i") docker rmi -f "$service":"${version}" echo "docker rmi $service:${version} 执行时间:$cdate" >> ~/log_delete_images.log # 自增加1 modifyCount=$((modifyCount + 1)) done fi done
|