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

时间:2014-11-06 02:28:29

标签: docker dockerhub

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

从他们的文档中

  

这将显示未标记的图像,即图像的叶子   树(不是中间层)。这些图像出现在新的构建时   图像将repo:标记从图像ID中移除,留下它   未标记。如果尝试在a时删除图像,将发出警告   容器目前正在使用它。通过这个标志,它允许   批量清理。

我不太明白这一点。为什么构建会使repo:tag远离图像ID?

2 个答案:

答案 0 :(得分:3)

Docker使用名为AUFS的文件系统,它代表增强文件系统。几乎每个Docker文件行都会创建一个新图像,当你将它们堆叠或扩充到彼此之上时,你将获得最终的docker图像。这实际上是一种缓存方式,因此如果只更改Docker文件的第9行,它将不会重建整个图像集。 (这取决于你的Docker文件中有什么命令,如果你有一个COPYADD之后没有任何内容被缓存为ex)

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

答案 1 :(得分:1)

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