问题:很多none的镜像无法被删除
解决过程:
1、通过 docker image prune -f 提示可删除为 0
2、直接进行删除报错:
docker rmi 8f5116cbc201
Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - image has dependent child images
批量删除容器,再删除镜像
# 停止所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
# 删除所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
# 删除所有none镜像
docker images|grep none|awk '{print $3 }'|xargs docker rmi
还是以失败告终。。。。。
原因
发现其实是因为TAG的问题,即有其他 image FROM 了这个 image,可以使用下面的命令列出所有在指定 image 之后创建的 image 的父 image
方案:
先查询依赖
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=XXX) # XXX指镜像ID
然后根据根据TAG删除容器,发现与之关联的none会自动删除
docker rm REPOSITORY:TAG
最终方案:
先保存镜像,关联的none会自动删除,最后在导入镜像,此时之前的none也不会在显示
docker images -a |grep -v none |awk '{print "docker save "$1":"$2 " >"$2".tar && docker rmi "$1":"$2" && docker load -i "$2".tar && docker image ls -a|grep "$2""}' >docker_image.sh
./docker_image.sh