【问题标题】:What happens when the base image of my image gets updated?当我的镜像的基础镜像更新时会发生什么?
【发布时间】:2018-05-05 15:29:12
【问题描述】:

我有基于microsoft/aspnet:4.6.2 的图像,当构建这些(我的)图像时,microsoft/aspnet:4.6.2 被拉下以构建我自己的图像。因此,在我的本地计算机中,我有 microsoft/aspnet:4.6.2 图像。假设基础映像已更新,Microsoft 发现映像存在错误并决定进行修复以维护标签,因此仍称为 microsoft/aspnet:4.6.2 但实际上它与我构建自己的映像时不同。

所以我有两个问题:
1. 每次我的镜像被拉下,它都会得到我构建镜像时的基础镜像,对吗? (这似乎很明显,但我需要检查)
2. 如果我注意到(网络挂钩、触发器?)有更新版本的microsoft/aspnet:4.6.2,我可以再次运行docker build 命令并且更新的图像会被拉下吗?请记住,旧的基本映像在我的文件系统中(称为相同)。 Docker 是否足够聪明,能够意识到我拥有该基础映像的旧版本并且它会下载它的最新版本?

希望我说清楚了

【问题讨论】:

  • 修复一个错误并使用相同的tag 发布新的image 将是一件坏事。这不能保证可重现的行为。您可能想看看thisthis(关于latest 标签)。

标签: docker dockerfile docker-build


【解决方案1】:

您的图片(由他人下载)将始终保持不变。图像依赖特定的layers 为图像提供 SHA256 校验和。修改父层将修改用于引用图像的校验和,从而成为新图像。该图像更改的唯一方法是,如果该图像被一个标签引用并且本地标签发生变化,无论是手动还是通过再次拉动图像标签。

docker build 默认会先使用本地图片。您需要分别运行 docker build --pulldocker pulldocker rmi IMAGE 以使构建使用最新的标记图像。

Docker Hub 构建服务具有build 功能,可在集线器中更新任何指定图像时自动重新构建。

【讨论】:

    【解决方案2】:

    如果您需要最新发布的基础镜像,请在 docker build 期间使用 --no-cache 选项,否则 docker 将始终使用本地可用的镜像,除非您在 docker build 后进行清理

    【讨论】:

    • --no-cache--pull 有什么区别?文档不清楚
    • 它们几乎相同。与无缓存相比,IIRC 拉取存在开放错误。
    【解决方案3】:
    1. 是的。 (在内部它使用IMAGE ID,而不是名称,来引用基本图像)
    2. IIRC 默认不智能。 (docker build 中有一个 --pull 开关)

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2020-01-20
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多