【问题标题】:Where do untagged Docker images come from?未标记的 Docker 镜像从何而来?
【发布时间】:2014-11-06 02:28:29
【问题描述】:

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

来自他们的文档

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

我不太明白这个。为什么构建将 repo:tag 与 IMAGE ID 分开?

【问题讨论】:

    标签: docker dockerhub


    【解决方案1】:

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

    【讨论】:

    • @adam-beck ...这是 OP 询问的那些未标记图像的根本原因
    【解决方案2】:

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

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

    【讨论】:

    • 那么中间步骤是创建未标记图像的步骤吗?为什么我似乎只在我的自定义 Dockerfile 上看到它们?当我从集线器复制一个时,我似乎没有得到它们。当我说复制时,我指的是 Dockerfile 的内容;我没有下载图片。
    • 你试过docker images -a 吗?这将显示一切
    • 请注意,docker images -a 是您查看中间图像的唯一方式;如果 OP 没有使用该选项,那么我的回答适用。
    猜你喜欢
    • 2023-01-17
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多