我正在创建一些非常简单的Docker容器。据我所知,每个步骤后都会创建一个新容器。但是,当使用Hub中的其他Dockerfiles时,我不会看到未标记的图像。那他们来自哪里?在网上浏览后,我发现了如何删除它们,但我希望更好地了解它们的来源。理想情况下,我希望防止它们被创建。
从他们的文档中
这将显示未标记的图像,即图像的叶子 树(不是中间层)。这些图像出现在新的构建时 图像将repo:标记从图像ID中移除,留下它 未标记。如果尝试在a时删除图像,将发出警告 容器目前正在使用它。通过这个标志,它允许 批量清理。
我不太明白这一点。为什么构建会使repo:tag
远离图像ID?
答案 0 :(得分:3)
Docker使用名为AUFS的文件系统,它代表增强文件系统。几乎每个Docker文件行都会创建一个新图像,当你将它们堆叠或扩充到彼此之上时,你将获得最终的docker图像。这实际上是一种缓存方式,因此如果只更改Docker文件的第9行,它将不会重建整个图像集。 (这取决于你的Docker文件中有什么命令,如果你有一个COPY
或ADD
之后没有任何内容被缓存为ex)
最终图像将被标记为具有任何标签,但所有这些中间图像都是创建最终图像所必需的,因此删除它们或防止它们被创建是没有意义的。希望这是有道理的。
答案 1 :(得分:1)
每当您将已经使用的标记分配给新图像时(例如,通过构建图像foo
,在其Dockerfile中进行更改,然后再次构建foo
),旧图像将丢失该标签但仍会保留,即使所有标签都被删除。这些旧版本的图片是docker images
输出中的未标记条目,您可以使用docker rmi <IMAGE HASH>
安全删除它们(但如果现有容器仍在使用,则会拒绝删除那个图像)。