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