3

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

从他们的文档

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

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

4

2 回答 2

5

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

于 2015-03-13T16:59:02.223 回答
2

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

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

于 2014-11-06T08:15:05.130 回答