当我的镜像的基础镜像更新时会发生啥?
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 --pull
、docker pull
或 docker rmi IMAGE
以使构建使用最新的标记图像。
Docker Hub 构建服务具有build 功能,可在集线器中更新任何指定图像时自动重新构建。
【讨论】:
【参考方案2】:如果您需要最新发布的基础镜像,请在 docker build 期间使用 --no-cache 选项,否则 docker 将始终使用本地可用的镜像,除非您在 docker build 后进行清理
【讨论】:
--no-cache
或 --pull
有什么区别?文档不清楚
它们几乎相同。与无缓存相比,IIRC 拉取存在开放错误。【参考方案3】:
-
是的。 (在内部它使用
IMAGE ID
,而不是名称,来引用基本图像)
IIRC 默认不智能。 (docker build
中有一个 --pull
开关)
【讨论】:
以上是关于当我的镜像的基础镜像更新时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章