通过摘要拉取 docker 镜像

Sta*_*tko 11 hash docker dockerhub docker-pull

我想问一下为什么在拉docker镜像时需要指定名称和摘要?

docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
Run Code Online (Sandbox Code Playgroud)

仅仅传递摘要是不够的,还是摘要在整个 docker 存储库的上下文中不够独特?

例如像这样:

docker pull sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
Run Code Online (Sandbox Code Playgroud)

BMi*_*tch 20

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

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

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


为了更深入地了解,pull 的 api将请求:

GET /v2/<name>/manifests/<reference>
Run Code Online (Sandbox Code Playgroud)

名称和参考参数用于标识图像并且是必需的。参考文献可以包括标签或摘要。

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

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

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

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

  • 这是一个很棒的解释,可能应该是公认的答案。 (4认同)

Moh*_*hsh 8

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

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

例如:

docker image pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
Run Code Online (Sandbox Code Playgroud)

  • OP 询问“仅仅传递摘要还不够吗?或者摘要在整个 docker 存储库的上下文中不够唯一?” (7认同)

Ita*_*ing -2

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

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

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

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