[英]How can I use Docker Registry HTTP API V2 to obtain a list of all repositories in a docker registry?
[英]How can I use the Docker Registry API to pull information about a container? Getting UNAUTHORIZED
我偶然发现了一篇文章,题目是检查Docker Images,而不是将它们拉入到基本上用REST调用进行docker inspect
所需的特定API调用的细节之中。 但是,我想知道自从撰写该文章以来,Docker注册表API是否发生了一些变化。
文章分析说,您需要按顺序进行三次REST调用,以获取有关容器的信息。 在公共Docker注册表的情况下,它们如下:
向auth.docker.io发出GET请求以获取令牌
curl "https://auth.docker.io/token?scope=repository:<image>:pull&service=registry.docker.io"
在这种情况下, image
可能像nginx
或docker
- 基本上是你正在查找的任何图像。 此REST调用返回一个令牌,以便在后续请求中使用。
用于检索清单列表的GET请求
curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -H "Authorization: Bearer <token-from-step-1>" "https://registry-1.docker.io/v2/<image>/manifests/<tag>"
这里的image
与步骤1相同, tag
可能是latest
。 此调用返回一些JSON; 关键是我们需要在.config.digest
提取值。 这是我们在最终请求中使用的摘要字符串。
最后,使用我们在步骤2中收到的摘要,检索容器配置的GET请求
curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -H "Authorization: Bearer <token-from-step-1>" "https://registry-1.docker.io/v2/<image>/blobs/<digest-from-step-2>"
这会返回一些JSON,我关心的字段是.config
我能够在私有Docker注册表上成功测试,尽管我必须为auth做一些不同的事情。 但是当我尝试跟随公共Docker注册表中的指南(我在上面的这些步骤中概述)时,我遇到了相反的问题:第1步给了我一个令牌,但是这个令牌毫无价值。 每当我尝试使用它时,在步骤2或3中,我得到了回复:
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"docker","Action":"pull"}]}]}
关于如何使这个工作的任何想法?
使用以下步骤,您可以检索任何公共容器图像的配置。
获取图像的相应标记。 请注意,您必须指定图像的全名 (官方图像使用library
存储库)。 因此, NGINX图像应该被称为: library/nginx
。
curl \\ --silent \\ "https://auth.docker.io/token?scope=repository:library/nginx:pull&service=registry.docker.io" \\ | jq -r '.token'
令牌简洁缩短: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXV ......
从清单中检索图像摘要。 对于此请求,您还需要指定有效标记(此示例使用latest
标记)。
curl \\ --silent \\ --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \\ --header "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXV..." \\ "https://registry-1.docker.io/v2/library/nginx/manifests/latest" \\ | jq -r '.config.digest'
SHA256:2bcb04bdb83f7c5dc30f0edaca1609a716bda1c7d2244d4f5fbbdfef33da366c
最后,使用以下请求获取容器配置。 在URL中,必须指定步骤2中的摘要。
curl \\ --silent \\ --location \\ --header "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXV..." \\ "https://registry-1.docker.io/v2/library/nginx/blobs/sha256:2bcb04bdb83f7c5dc30f0edaca1609a716bda1c7d2244d4f5fbbdfef33da366c" \\ | jq -r '.container_config'
缩短输出以简化:
{ "Hostname": "6c02a05b3d09", "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.15.10-1~stretch", "NJS_VERSION=1.15.10.0.3.0-1~stretch" ], "Labels": { "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>" }, "StopSignal": "SIGTERM" }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.