最新消息:

Docker删除镜像错误 image has dependent child images

docker admin 4751浏览 0评论

清理镜像

 # docker images | grep ubuntu
REPOSITORY                                       TAG                 IMAGE ID            CREATED             SIZE
ubuntu                                           18.04               775349758637        5 weeks ago         64.2MB
ubuntu                                           <none>              cf0f3ca922e0        7 weeks ago         64.2MB

由于 ubuntu:18.04 更新了所以, image id 也改变了, \<none> 可以删除

# docker rmi cf0f3ca922e0
Error response from daemon: conflict: unable to delete cf0f3ca922e0 (cannot be forced) - image has dependent child images

意思有其他image在引用, 无法删除

强制镜像

# docker rmi -f cf0f3ca922e0
Error response from daemon: conflict: unable to delete cf0f3ca922e0 (cannot be forced) - image has dependent child images

不推荐, 但这里也失败了

清理容器后在删除

 # docker ps -a --format "{{.ID}} {{.Status}}" | grep -v ' Up ' | awk '{print $1}' | xargs docker rm
 # docker rmi cf0f3ca922e0
Error response from daemon: conflict: unable to delete cf0f3ca922e0 (cannot be forced) - image has dependent child images

删除所有非 Up 状态容器, 但最后还是 失败了

清理依赖镜像

最主要是找到 有那些 image引用了 cf0f3ca922e0 把引用image清理掉就可以了

 # docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=cf0f3ca922e0)
[registry.docker.io/aikaiyuan/builder:xxxx] sha256:xxx sha256:xxx
[registry.docker.io/aikaiyuan/builder:yyyy] sha256:yyy sha256:yyy
......
......

删除 registry.docker.io/aikaiyuan/builder:xxxx, registry.docker.io/aikaiyuan/builder:yyyy 后, cf0f3ca922e0 也就可以正产删除了

补充

有效的 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没有自动垃圾回收处理机制,未来可能会有这方面的改进,但是目前我们只能这样手动清理(写个脚本就好)。

转载请注明:爱开源 » Docker删除镜像错误 image has dependent child images

您必须 登录 才能发表评论!