"docker build --pull"的目的是什么?

111

当构建一个docker镜像时,通常使用的是docker build .

但我发现可以指定--pull,整个命令看起来就像是docker build --pull .

我不确定--pull的目的。Docker的官方文档中说,“始终尝试拉取图像的更新版本”,而我不确定这在这种情况下意味着什么。

您使用docker build来构建新镜像,并最终将其发布到容器注册表中。为什么要拉取还不存在的东西呢?

3个回答

122

使用--pull选项时,它会拉取任何基础镜像的最新版本,而不是重复使用本地标记过的镜像

以基于移动标记(例如ubuntu:bionic)的图像为例。上游周期性地进行更改和重建,但您可能已经拥有几个月前的镜像。Docker将愉快地构建旧的基础镜像。--pull将作为副作用拉取最新的基础镜像,因此您将构建最新的基础镜像

通常最好的做法是尽快使用--pull获取上游安全修补程序(而不是使用过时、可能存在漏洞的镜像)。尽管您必须权衡破坏性变更的影响(如果您使用了不可变标记,则不会产生影响)


2
这篇解释使用了 ubuntu:bionic 镜像,非常好,因为它没有附加版本号,但是每当他们发布新的镜像,它仍然会有所不同。所有的都说得通。谢谢! - Jim Aho
1
如果基础镜像是ubuntu:0.1.0,并且他们发布了一个新的镜像,但版本号相同,即ubuntu:0.1.0 - 这是否意味着docker build --pull将重新下载整个新镜像?(这可能是大多数人喜欢的方式) - Jim Aho
我希望有人能澄清@JimAho的最后一个问题,因为那也是我想更好地理解的。如果图像只是被推送了,而没有其他变化,那么它是否不需要重新构建? - learning2learn
3
@learning2learn 答案是肯定的,Docker镜像的标签只是一个字符串,因此 "0.1.0" 和答案中的示例 "bionic" 没有任何区别。 - anthony sottile
1
如果您想确保拉取的镜像版本正确,不要使用标签进行拉取。使用摘要进行拉取。您可以使用镜像的SHA哈希签名来确保获取您期望的镜像。如果您在开发机器上使用 :develop 标签,则 --pull 帮助您保持最新状态,但对于生产/ Helm 图表,我会切换到摘要,因为它更可靠。 - Ian Robertson
显示剩余4条评论

12
Docker允许在构建镜像时使用--pull标志,例如docker build . --pull -t myimage, 以确保始终使用最新的容器镜像版本进行构建,而不考虑本地可用版本。但是有一个值得注意的附加点:
为了确保您的构建完全重建,包括检查基础镜像是否有更新,请在构建时使用以下选项: --no-cache - 这将强制重新构建已经存在的层。
因此完整的命令如下: docker build . --pull --no-cache --tag myimage:version 对于docker-compose也有相同的选项: docker-compose build --no-cache --pull

11
正常情况下你不需要使用 --no-cache,如果基础镜像被更新了(使用 --pull 获取新版本),缓存会自动失效;同样地,如果你复制了不同的代码,也会使缓存失效。通常唯一受影响的是,如果你正在安装网络主机包(如 apt-get install),那么 --no-cache 将导致即使基础镜像没有更新也会检查是否有更新版本。 - David Maze
我猜想,当使用 --pull 时,如果基础镜像没有接收到任何更新,则可以使用 --no-cache 来忽略/使本地缓存失效。 - Stphane

3
简单来说,docker build用于从本地dockerfile构建镜像,docker pull用于从docker hub下载镜像。如果在不带dockerfile的情况下使用docker build,则会抛出错误。
当您指定--pull:latest时,Docker将尝试下载最新版本(如果有)。
基本上,如果添加了--pull参数,每次运行命令时,它都会尝试拉取最新版本。

如果您有分层图像,它是否始终会拉取所有图层? - Jim Aho
1
如果您有分层图像,则某些图层将被缓存在计算机上(旧图层),而任何新图层都将被提取。 - DUDANF
1
我想补充一点,使用 --pull 是确保构建的镜像得到最新更新的好方法。如果你的 Dockerfile 引用了 node:16-buster,你需要使用 pull 来确保获取所有的修补程序(例如 16.16.0)。 - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接