“ docker build --pull”的目的是什么?


17

在构建docker映像时,通常使用docker build .

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

我不确定的目的--pull。Dockers的官方文档说“总是尝试提取该映像的新版本”,在这种情况下我不确定这意味着什么。

您用于docker build构建新映像,并最终将其发布到容器注册表的某个位置。您为什么要拉一些尚不存在的东西?

我希望可以在网络上轻松找到像“简单”这样的东西,但是似乎没有人有与此类似的问题。Google上唯一真正的成功是指Dockers官方文档,我(如上所述)不了解。

谢谢你的帮助!

Answers:


17

它将提取任何基本映像的最新版本,而不是重复使用您在本地已标记的任何内容

例如根据移动标签(例如ubuntu:bionic)拍摄图像。上游会进行更改并定期重建它,但是您可能在本地拥有一个月的图像。码头工人会很乐意根据旧基地建造。 --pull会产生副作用,因此您将根据最新的基础图像进行构建

通常,最好的方法是尽快使用它来获取上游安全修复程序(而不是使用过时的,可能存在漏洞的映像)。尽管您必须权衡重大更改(如果您使用不可变标签,则不会有所作为)


对于ubuntu:bionic图像,这是一个很好的解释,因为(显然)它没有附加版本,但是每当他们发布新图像时,它仍然会有所不同。一切都有道理。谢谢!
Jim Aho

1
如果以基本映像ubuntu:0.1.0为例,并且他们发布了新映像但版本相同,ubuntu:0.1.0-这是否意味着docker build --pull将再次重新下载整个新映像?(我猜这将是大多数人喜欢的东西)
Jim Aho

我希望有人能澄清@JimAho的最后一个问题,因为这也是我想更好地理解的地方。如果刚刚推送了映像,并且没有其他任何更改,那么是否不重建映像?
learning2learn

2
@ learning2learn答案是肯定的,码头工人图像的标签只是一个字符串,因此“ 0.1.0”与答案“ bionic”中的示例没有区别
Anthony Sottile

@AnthonySottile谢谢。非常。
learning2learn

1

简单的答案。docker build用于从本地dockerfile构建。docker pull用于从docker hub拉出。如果您使用没有docker文件的docker build,则会引发错误。

当您指定--pull:latestdocker将尝试下载最新版本(如果有)

基本上,如果添加--pull,它将在每次运行时尝试拉出最新版本。


如果您有分层的图像-它将始终拉动所有图像吗?
Jim Aho

如果您有分层的图像,则某些图像将被缓存在计算机上(较旧的层),并且将提取任何新的层。
DuDoff

0

Docker允许将--pull 标志传递  给  docker build例如  docker build . --pull -t myimage。这是推荐的方法,以确保尽管本地提供了可用的版本,该构建仍始终使用最新的容器映像。但是,还有一点值得一提:

为确保完全重建您的构建,包括检查基础映像是否有更新,请在构建时使用以下选项:

--no-cache -这将强制重建已经可用的图层。

因此,完整的命令将如下所示:

docker build . --pull --no-cache --tag myimage:version

相同的选项可用于docker-compose

docker-compose build --no-cache --pull


在正常使用中,您不需要--no-cache。如果基础映像已更新(并--pull获得新版本),从而自动使缓存无效;同样,如果您使用COPY不同的代码会使缓存无效。通常会影响的唯一事情是,如果您正在执行apt-get install网络托管程序包之类的操作,在这种情况下,--no-cache即使基础映像尚未更新,也会导致它检查较新的版本。
David Maze
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.