如何仅在需要时从 Docker 注册表中提取,或者 "latest" 这个词是什么意思?

How do I pull from a Docker registry only when required, or what does the word "latest" even mean?

我正在使用 Gitlab-CI 在 docker-in-docker 图像中构建一些 Docker 图像。这很重要,因为每个构建都使用一个新的 docker-in-docker 环境和一个空的 Docker 缓存。可以在 Gitlab 中缓存缓存并在以后恢复它,但这似乎并不安全——网上有人这样做了——但那似乎并不安全。

我在 Nexus 中有一个 Docker 注册表,我已成功用于拉取和推送。

我还设置了使用 docker save 将图像保存到 Gitlab-ci 的缓存中并使用 docker load.

从缓存中加载

从注册表中提取 或从 Gitlab-CI 缓存中加载 ,然后我可以 运行 docker build --cache-from ... 和 Docker 将逐步构建,不会重建任何未更改的图像层。

所有构建的图像都获得 latest 标签。

不起作用的部分是:如果我从 Gitlab-CI 缓存加载图像,然后从注册表中拉取,注册表中的图像是 always 用作来自 Docker 的观点,即使它比从缓存加载的那个早几周。这似乎是有缺陷的行为——至少可以说,据我所知,这是非常出乎意料且没有记录的。

我怎样才能告诉 Docker : 1)使用最新的作为最新的(没有 latest 标签的替代方案是可能的),并且 2) 仅下载自加载到 Docker 的缓存后发生变化的图层?

这是 2 个问题,但我希望他们有相同的答案。

好的,如果你的意思是yourimage:latest,那么latest没有任何意义,因为它只是一个约定,并不能保证你真的拉到了字面上最新(最新)的图像。

如果您从本地加载图像 yourimage:latest,然后从注册表 (yourimage:latest) 中拉取同名图像,最后一个将是及时的 latest。因为它与第一个不同,即使第一个是及时更新的。如果它有另一个指纹,它将被覆盖。