背景
偶然间发现服务器上有不少镜像占用很多空间,想清理一下。
结果直接进行删除报错:docker
docker rmi 8f5116cbc201 Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - image has dependent child images
而后上网需求方法,主流的方法有两种数据库
方法一:强制删除镜像编程
docker rmi -f 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 的父 imageui
方案
先查询依赖spa
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=XXX) # XXX指镜像IDcode
而后根据根据TAG删除容器orm
docker rm REPOSITORY:TAGblog
补充
docker none镜像
有效的 none 镜像
Docker文件系统的组成,docker镜像是由不少 layers组成的,每一个 layer之间有父子关系,全部的docker文件系统层默认都存储在/var/lib/docker/graph目录下,docker称之为图层数据库。
最后作一个总结< none>:< none> 镜像是一种中间镜像,咱们可使用docker images -a来看到,他们不会形成硬盘空间占用的问题(由于这是镜像的父层,必须存在的),可是会给咱们的判断带来迷惑。
无效的 none 镜像
另外一种类型的 < none>:< none> 镜像是dangling images ,这种类型会形成磁盘空间占用问题。
像Java和Golang这种编程语言都有一个内存区,这个内存区不会关联任何的代码。这些语言的垃圾回收系统优先回收这块区域的空间,将他返回给堆内存,因此这块内存区对于以后的内存分配是有用的
docker的悬挂(dangling)文件系统与上面的原理相似,他是没有被使用到的而且不会关联任何镜像,所以咱们须要一种机制去清理这些悬空镜像。
咱们在上文已经提到了有效的< none>镜像,他们是一种中间层,那无效的< none>镜像又是怎么出现的?这些 dangling镜像主要是咱们触发 docker build 和 docker pull命令产生的。
使用下面的命令能够清理docker rmi $(docker images -f “dangling=true” -q)docker没有自动垃圾回收处理机制,将来可能会有这方面的改进,可是目前咱们只能这样手动清理(写个脚本就好)。