了解 Docker 的“最新”标签

Docker 标签用于按名称识别图像。每个图像可以分配多个标签。标签看起来类似于 my-image:latest,冒号前的部分定义图像名称,后一部分指定版本。
您可以标记冒号后没有任何内容的图像。您的图像将被自动赋予 latest 作为其版本标签。对于 Docker 新手来说,这是一个常见的困惑来源。
最新的问题
latest 标签的语义似乎暗示了一些超出实际存在的特殊含义。实际上,当您没有指定任何其他内容时,latest 被用作默认标签。那是唯一它会被使用的时间——它不会自动引用你构建的最新图像。
这是由此产生的问题的示例:
# Creates my-image:latest (first image)
docker build -t my-image
# Updates my-image:latest (second image)
docker build -t my-image:latest
# Creates my-image:v1 (third image)
docker build -t my-image:v1如果您现在运行 docker run my-image:latest,您将使用要构建的第二个 映像。 v1 标签完全独立于 latest,因此构建第三张图片对现有的两张图片没有影响。如果您希望 my-image:v1 也成为 latest 图像,您需要手动标记并在单独的操作中推送它。
这在 Docker 生态系统中造成了很多混乱。许多图像创作者确实用latest 标记他们的最新版本。这赋予了标签额外的重要性,而 Docker 并没有打算这样做。其他作者使用 latest 作为他们的开发版本,而有些作者根本不会发布 latest 标签。
图像作者之间缺乏一致性可能导致不清楚 latest 是否真的是最新图像。 latest 最重要的规则是永远不要假设特定图像将如何使用标签。
避免固定到最新
只要有更具体的替代方案,您就不应该使用图像的 latest 标签。除非您知道图像的作者主动更新 latest 标签,否则固定它可能不会提供您期望的版本。
大多数图像使用语义版本控制来创建发布标签。使用 my-image:1.1 比使用 my-image:latest 更安全。如果作者不维护 latest,您最终可能会得到一张严重过时的图像。相反,确实维护latest 的作者通常将标签用于他们的前沿开发版本。固定它可能会定期提供您不会被警告的重大更改。
出于这个原因,一些容器生态系统项目现在警告不要使用 latest。 Kubernetes 指出,使用 latest 不仅不可预测,而且会让您更难识别容器使用的 真实 映像版本。
无法直接回滚使用 latest 部署的容器。你没有参考点可以使用。将图像标记从 1.1.0 更改为 2.1.0 可让您在需要时轻松恢复升级。容器编排工具无法帮助您将“新的 latest 映像”改回“旧的 latest 映像”。
不变性
更根本的是,良好的标记实践要求图像标签应该是不可变的。分配标签后,同一图像不应重复使用该标签。这允许下游消费者针对特定版本进行定位,因为他们知道每次都会获得相同的图像。
latest 本质上是可变的,因此打破了这个系统。如果您使用 latest,则必须接受更改。作为图像作者,如果您仅使用 latest 标签发布,您将让用户更难自信地引用您的图像。
许多工具对如何使用图像标签做出假设。 latest 通常会得到特殊对待,您需要注意这一点。例如,Kubernetes 将总是尝试拉取更新版本的 latest 标签,即使本地已经存在。其他标签只有在集群中不存在时才会被拉取。
更好的标记方法
当您标记将公开可用的图像时,请尝试坚持语义版本控制。这是一个广为人知的标准,有助于传达您对图像所做的每项更改的大小。
创建供私人使用的图像时,您有更多选择。由 CI 服务器构建的图像通常可以使用运行管道的提交的 SHA 进行标记。这可确保每个管道创建一个未来不会被覆盖的唯一标签。它还可以帮助您将容器注册表中的图像与创建它们的代码库更改相匹配。
最后,不要过度考虑 latest 标签。你不需要用你的图像的“最新”版本来更新它。通常最好完全忽略它——除非你在没有标签名的情况下运行 docker build,否则它永远不会被创建。如果您确实发布了 latest 标签,请务必说明它将引用什么。
概括
Docker 的 latest 标签看似简单,却掩盖了可能存在的问题。作为图像作者和消费者,您会遇到他们。问题源于标签的语义不一致:虽然它听起来是动态的,但它只不过是 Docker 在没有用户提供的值的情况下分配的静态标签。
您应该尽可能固定特定的图像版本。这将帮助您避免重大更改和模棱两可的第三方工具行为。作为图像作者,请尝试提供语义发布版本并明确您的项目如何处理 latest。这将帮助潜在用户评估如何引用您的图像。