如何在Docker中提交子镜像后删除父镜像?

5

我在系统中安装了一个大小约为1GB的带有操作系统的docker镜像,然后更新并安装了额外的软件,将其大小推到了接近2GB。我使用此容器通过 docker commit <cont-id> <child-name> 创建了一个新的子镜像。现在我有两个docker镜像,包括父镜像和子镜像,总共占用3GB。由于我有冗余的1GB父镜像,我想将其删除。

Parent  image 1 GB
Child   image 2 GB

我尝试保留子映像并通过docker rmi -f <image-id>删除父映像,但是出现以下错误:

来自守护程序的错误响应:冲突:无法删除5dvd3054h756 (无法强制)——映像具有依赖的子映像

然后尝试了此解决方案,我运行了sudo docker images --filter "dangling=true" -q --no-trunc但没有返回任何内容,并且还尝试了docker system prune,其显示为0 GB。

我还计划向Docker内部安装其他程序,因此希望从现有的子映像中生成新的子映像。我在各处搜索,但没有好的解决方案可以删除Docker中的父映像,原因是读取了一些子映像使用的父层。是否没有办法在创建新的子映像之后删除Docker中的父映像?


2
在您的情况下,不存在多余的图像层。这两个新图像将共享一个图像层(您首先构建的操作系统镜像)。因此,磁盘使用量不是3GB,您可以使用“du -sh”命令进行检查。 - Light.G
你能列出你创建子镜像的过程中运行的命令吗? - Blue Clouds
2个回答

6

使用docker rmi <repo:tag>代替docker rmi <image_id>

您可以从docker images的输出中获取存储库和标签

@atline的答案是理论部分的答案。在此提到的是删除相同基础镜像的以前版本的方法,假设子(或较低层)不会被删除/受影响

来源:https://dev59.com/mloT5IYBdhLWcg3w2CMw#50650745


1
这个注释对于删除具有依赖子图像的图像非常有用,谢谢,这帮了我一个大忙。 - Shaphan
如果父级标签为TAG = <none>怎么办?我无法删除它... - Alessandro

3

容器是由不同的Docker镜像层组成的。

因此,当您向容器添加新内容并最终将其制作为另一个镜像时,只需在原始镜像层之上添加一个新层,无需删除基本镜像层,它们被您的新容器共享。仅有这些基本镜像层,您的新镜像才能与其自身的层一起形成一个新的容器。

enter image description here


但是,他仍然会遇到这个问题(留下多个无用的图像,只有下一个基于它构建的图像才有用)。他可能只能使用最后一个图像。 - Light.G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接