当我的镜像的基础镜像更新时会发生啥?

Posted

技术标签:

【中文标题】当我的镜像的基础镜像更新时会发生啥?【英文标题】: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 将是一件坏事。这不能保证可重现的行为。您可能想看看this 和this(关于latest 标签)。 【参考方案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】:
    是的。 (在内部它使用IMAGE ID,而不是名称,来引用基本图像) IIRC 默认不智能。 (docker build 中有一个 --pull 开关)

【讨论】:

以上是关于当我的镜像的基础镜像更新时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

docker 镜像的大小和虚拟大小有啥区别?

在 Docker 中使用多个基础镜像有啥影响?

制作django项目的docker镜像

当我使用 Alpine 作为基础镜像时,如何添加用户?

Docker镜像

如何创建一个 Gitlab webhook 来更新 Github 上的镜像仓库?