未标记的 Docker 镜像从何而来?

ada*_*eck 3 docker dockerhub

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

从他们的文档

这将显示未标记的图像,即图像树的叶子(不是中间层)。当新构建的图像将 repo:tag 与 IMAGE ID 分开时,就会出现这些图像,而使其未标记。如果在容器当前正在使用图像时尝试删除图像,则会发出警告。通过拥有这个标志,它允许批量清理。

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

jwo*_*der 5

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


Rez*_*a S 2

Docker 使用名为 AUFS 的文件系统,它代表增强文件系统。Docker 文件的几乎每一行都会创建一个新映像,当您将它们堆叠或增强时,您将获得最终的 docker 映像。这本质上是一种缓存方式,因此如果您仅更改 Docker 文件的第 9 行,它不会重建整个映像集。(这取决于你在 Docker 文件上有什么命令,如果你有一个COPYADD没有,那么在该点之后缓存为 ex)

最终图像将被标记为具有任何标签,但所有这些中间图像都是创建最终图像所必需的,因此删除它们或阻止创建它们是没有意义的。希望这是有道理的。

  • 请注意,“docker images -a”是您查看中间图像的唯一方法;如果OP没有使用该选项,那么我的答案适用。 (2认同)