未标记的Docker图像来自哪里?

我正在创build一些非常简单的Docker容器。 我知道每一步之后都会创build一个新的容器。 但是,当使用Hub中的其他Docker文件时,我不会收集未标记的图像。 那么他们从哪里来? 在网上浏览后,我发现如何删除它们,但我想更好地了解它们来自哪里。 理想情况下,我想阻止他们被创造。

从他们的文档

这将显示未标记的图像,即图像树的叶子(不是中间层)。 这些图像出现在图像的新构build将repo:标签从IMAGE ID中移开时,将其标记为未标记。 当容器正在使用时,如果尝试删除图像,将会发出警告。 有了这个标志,它允许批量清理。

我不太明白这一点。 为什么builds将repo:tag从IMAGE ID中删除?

Docker使用一个名为AUFS的文件系统,它代表扩展文件系统。 几乎每一个Docker文件的每一行都会创build一个新的图像,当你将所有的图像堆叠起来的时候,你会得到最终的docker图像。 这本质上是一种caching方式,所以如果只更改Docker文件的第9行,它将不会重build整个图像集。 (那么取决于你的Docker文件上有什么命令,如果你有一个COPY或者没有ADD任何东西,那么这个点就被caching为ex)

最终的图像将被标记为任何标签,但是所有这些中间图像对于创build最终图像是必要的,所以删除它们或者防止它们被创build是没有意义的。 希望是有道理的。

每当你将一个已经被使用的标签分配给一个新的图像(比如,通过构build图像foo ,在Dockerfile中进行修改,然后再次构buildfoo ),旧图像将会丢失该标签,如果所有的标签都被删除。 这些旧版本的图像是docker images输出中的未加标签的条目,您可以使用docker rmi <IMAGE HASH>安全地删除它们(尽pipe如果存在仍然使用该图像的现存容器,删除将被拒绝)。