通过摘要拉取Docker镜像

36

我想问的是,为什么在拉取 Docker 镜像时需要同时指定名称和摘要?

docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

仅通过摘要是否足够,或者在整个Docker存储库的上下文中摘要不够唯一?

例如:

docker pull sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

从什么时候开始需要包含摘要? - Mike Doe
1
不需要包含摘要。您可以通过图像名称和标签来拉取它。您可以用摘要替换标签。我的假设是,每个存储库的摘要是唯一的,因此在这种情况下,我不确定为什么拉取图像时仍然需要名称。 - Stanimir Mitko
@StanimirMitko,考虑到投票数量,请您将答案标志更改为我的答案。这样可以帮助更多人。 - Mohammad Ravanbakhsh
4个回答

40

解决方法:

您必须按以下方式将 image 选项传递给您的命令:

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

例如:(ubuntu 18.04)

docker image pull ubuntu:18.04@sha256:98706f0f213dbd440021993a82d2f70451a73698315370ae8615cc468ac06624

6
楼主在询问:“仅通过摘要是否足够,或者在整个Docker仓库的上下文中摘要不够唯一?” - BMitch
如何使用哈希值提取特定的图层? - undefined
@CSQGB 这个链接可能对你有所帮助。 - undefined

17
该名称是必需的,因为注册表API的设计。 Docker中的镜像拉取都返回到注册表服务器上的存储库。 存储库是服务器上的路径,包含多个图像清单,以及其他blob(图像配置,层和可能通过摘要拉取的其他数据)。 针对存储库而不是整个注册表运行所有API请求的一个关键原因是处理授权。否则,每个针对摘要的请求都需要反向查找引用该摘要的所有存储库,并查看用户是否有权限访问该摘要。 您也不会针对某个全局注册表命名空间运行请求,因为存在多个注册表,并且可以轻松创建新的注册表。 Docker Hub可能是最受欢迎的,但大多数云提供商,GitHub和GitLab等CI提供商以及公司网络中的自托管注册表,其自己的生产集群和开发人员笔记本电脑上都有注册表。 因此,这个请求可能需要花费的时间没有上限,需要发现新的注册表,包括可能在您的私有网络中创建的注册表。

深入了解拉取api的信息如下:

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

名称和引用参数标识图像并且是必需的。引用可能包含标记或摘要。

(文档中提到的“名称”是仓库名称。)

Docker命令与此API设计相对应,需要图像名称。如果您留下标记或摘要,则会将“latest”用作默认值。当您省略注册表名称时,它默认为Docker Hub。如果还省略了用户名,它会在注册表名称前加上library/,其中所有官方图像都位于Docker Hub上。

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

尝试从拉取中省略存储库名称将导致无效的语法(docker将其称为引用格式),因为它无法从空白中推断存储库,并且没有默认的存储库名称。


2
这是一个非常好的解释,可能应该被接受为答案。 - Soulriser

-2

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

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

如果没有服务器名称,则默认为Docker Hub,也称为docker.io。 因此,ubuntudocker.io/library/ubuntu相同。

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


谢谢你的回答,Itamar!我想我明白了你的观点。我忘记了名称实际上包括我们提取的注册表。在这种情况下,仅使用摘要将无法指出应该位于哪个Docker注册表中的映像。我认为这应该是被接受的答案! - Stanimir Mitko

-5

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

使用摘要进行拉取也不常见。通常使用映像标签。

例如:docker pull ubuntu:16.04


谢谢回答!确实标签更常见,但我认为使用摘要取决于用例。当我们想要确保图像的完整性不被破坏时,我认为使用摘要更合适。然而,由于用例不是问题的一部分,所以我离题了。 - Stanimir Mitko
我认为这应该更普遍,因为在我的团队中,我们曾经遇到过不同员工之间图像不一致的问题。我们使用了FROM image:tag,但是根据您构建本地镜像的时间,可能会得到不同的结果。现在我们使用image:tag@digest进行拉取,以确保我们都使用相同的基础镜像。这有助于跟踪安全更新等方面的问题。 - Jonathan Adami
1
这就是你的问题所在。一旦一个带有图像标签名称的图像被推送到仓库中,就不应该允许它被覆盖。只有“latest”标签是此规则的例外,“latest”不应该被其他人用作基础图像。 - Shashank V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接