18

想问一下为什么拉docker镜像的时候需要同时指定name和digest?

docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

只是传递摘要还不够,还是摘要在整个 docker 存储库的上下文中不够唯一?

例如像这样:

docker pull sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
4

4 回答 4

12

解决方案:

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

docker image pull [选项] 名称:[TAG@DIGEST]

例如:(ubuntu 18.04)

docker image pull ubuntu:18.04@sha256:98706f0f213dbd440021993a82d2f70451a73698315370ae8615cc468ac06624
于 2020-08-01T12:04:50.770 回答
4

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

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

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


为了更深入地了解,用于拉取的 api将请求:

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

name 和 reference 参数标识图像并且是必需的。参考可以包括标签或摘要。

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

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

因此,拉取请求ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2将变成registry-1.docker.io对存储库的请求(Docker Hub 的注册表 API 服务器),library/ubuntu并引用您列出的 sha256。

尝试从 pull 中省略存储库名称将导致语法无效(docker 将其称为参考格式),因为它无法从零中推断存储库并且没有默认存储库名称。

于 2020-08-01T13:27:10.327 回答
-2

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

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

例如:docker pull ubuntu:16.04

于 2020-01-09T21:31:52.537 回答
-4

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

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

如果没有服务器名称,则默认为 Docker Hub,即docker.io. 所以ubuntu是一样的docker.io/library/ubuntu

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

于 2020-01-09T21:28:34.763 回答