按摘要拉取 docker 个图像

Pulling docker image by digest

请问为什么拉取docker镜像时需要同时指定name和digest?

docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

仅仅传递摘要还不够吗,或者摘要在整个docker存储库的上下文中不够唯一?

例如这样的:

docker pull sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

图像是从注册表中提取的。图像名称包括注册表,例如quay.io/yourgroup/yourimagequay.io 服务器拉取。

但是ubuntu不包括服务器名称,你说?

如果没有服务器名称,则默认为 Docker 集线器,又名 docker.io。所以 ubuntudocker.io/library/ubuntu 相同。

因此,您需要知道名称,以便它知道要与哪个图像注册服务器通信。

摘要在 docker 存储库中的所有图像中可能是唯一的,但您认为更常见的用法是什么?拉取名为 ubuntu 的镜像还是拉取名为 sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 的镜像?

使用摘要拉取也不常见。使用图像标签。

例如:docker pull ubuntu:16.04

解法:

您必须将 image 选项传递给您的命令,如下所示:

docker image pull [OPTIONS] NAME:[TAG@DIGEST]

例如:(ubuntu 18.04)

docker image pull ubuntu:18.04@sha256:98706f0f213dbd440021993a82d2f70451a73698315370ae8615cc468ac06624

由于注册表 API 的设计方式,因此需要该名称。图像拉入 docker 全部返回到注册表服务器上的存储库。存储库是服务器上的一条路径,包含多个图像清单以及其他 blob(图像配置、层,以及可能由摘要提取的其他数据)。

运行 所有 API 对存储库而不是整个注册表的请求的一个关键原因是处理授权。否则,每个摘要请求都需要对引用该摘要的所有存储库进行反向查找,并查看用户是否有权访问该摘要。

您也不会 运行 对某个全局注册表命名空间的请求,因为有多个注册表,并且可以轻松创建新的注册表。 Docker Hub 可能是最受欢迎的,但也有大多数云提供商的注册表,CI 提供商,如 GitHub 和 GitLab,以及公司网络上的自托管注册表,在他们自己的生产集群中,以及开发人员笔记本电脑。因此,该请求可能需要多长时间没有上限,并且需要一种发现方法来查找新的注册表,包括那些可能已经在您的专用网络中创建的注册表。


要进行更深入的研究,api for a pull 将请求:

GET /v2/<name>/manifests/<reference>

The name and reference parameter identify the image and are required. The reference may include a tag or digest.

(该文档中引用的“名称”是存储库名称。)

docker 命令反映了这个 API 设计,需要图像名称。如果您离开标签或摘要,它将使用“最新”作为默认值。当您离开注册表名称时,它默认为 Docker Hub。如果您还遗漏了用户名,它会在注册表名称前加上 library/ 前缀,其中所有官方图像都位于 Docker Hub 上。

因此 ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 的拉取请求将变成对 registry-1.docker.io(Docker Hub 的注册表 API 服务器)的请求 library/ubuntu 参考你列出的 sha256。

尝试从拉取中删除存储库名称将导致语法无效(docker 将此称为引用格式),因为它无法从无到有地推断存储库并且没有默认存储库名称。