sta*_*yra 5 rest restful-authentication docker dockerhub docker-api
与我合作的外部组织允许我访问私有(受身份验证令牌保护的)docker 注册表,最终我希望能够使用 docker 的 HTTP API V2 查询此注册表,以便获取所有注册表中可用的存储库和/或图像。
但在我这样做之前,我首先想获得一些在公共注册表(如Docker Hub )上构建这些类型的 API 查询的基本实践。因此,我继续在 Docker Hub 上使用用户名和密码注册了自己,并查阅了 API V2 文档,其中指出可以请求进行API 版本检查,如下所示:
GET /v2/
Run Code Online (Sandbox Code Playgroud)
或请求存储库列表为:
GET /v2/_catalog
Run Code Online (Sandbox Code Playgroud)
使用 curl 以及我用于注册 Docker Hub 帐户的用户名和密码,我尝试在命令行构造一个 GET 请求:
stachyra> curl -u stachyra:<my_password> -X GET https://index.docker.io/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
stachyra> curl -u stachyra:<my_password> -X GET https://index.docker.io/v2/_catalog
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}
Run Code Online (Sandbox Code Playgroud)
当然,<my_password>我用我的实际帐户密码代替了 。
我一直期望从这个查询中得到的响应是一条巨大的 json 消息,列出了数千个存储库名称,但 API 似乎拒绝了我的 Docker Hub 凭据。
问题 1:我什至有index.docker.iodocker hub 注册表的正确 URL ( ) 吗?(我首先根据命令行工具返回的状态信息做出了这个假设docker info,所以我有充分的理由认为它是正确的。)
问题 2:假设我有正确的注册表服务 URL,为什么我的查询返回“UNAUTHORIZED”错误代码?当我尝试通过 hub.docker.com 上的网络登录时,我的帐户凭据工作正常,那么这两种情况有什么区别?
Kan*_*hal 20
我有正确的网址吗
index.docker.io通过 DockerHub 托管 Docker 实现。hub.docker.com托管丰富的 DockerHub 特定API。_catalogAPI 。为什么我的查询返回“UNAUTHORIZED”错误代码?
为了使用 Docker V2 API,需要为https://auth.docker.io/token每个调用生成 JWT 身份验证令牌,并且该令牌必须在 DockerHub 调用中用作 Bearer 令牌:index.docker.io
当我们像这样点击 DockerHub API 时https://index.docker.io/v2/library/alpine/tags/list,它会返回 401,其中包含有关缺少的飞行前身份验证调用的信息。www-authenticate我们在失败的请求中查找响应标头。
例如:www-authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:library/alpine:pull",error="invalid_token"
这意味着,我们需要显式调用以下 API 来获取身份验证令牌。
https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/alpine:pull
该https://auth.docker.io/token作品没有任何公共回购授权。要访问私有存储库,我们需要向请求添加基本的 http 身份验证。
https://<username>:<password>@auth.docker.io/token?service=registry.docker.io&scope=repository:<repo>:pull
注意:auth.docker.io即使请求无效(无效的信用或范围或任何内容),也会生成令牌。为了验证令牌,我们可以解析 JWT(例如:来自 jwt.io)并检查access有效负载中的字段,它应该包含请求的范围引用。
sta*_*fry 11
这是一个从注册表读取存储库的示例程序。我用它作为 Docker Hub 的学习辅助工具。
#!/bin/bash
set -e
# set username and password
UNAME="username"
UPASS="password"
# get token to be able to talk to Docker Hub
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)
# get list of repos for that user account
REPO_LIST=$(curl -s -H "Authorization: JWT ${TOKEN}"
https://hub.docker.com/v2/repositories/${UNAME}/?page_size=10000 | jq -r '.results|.[]|.name')
# build a list of all images & tags
for i in ${REPO_LIST}
do
# get tags for repo
IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}"
https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/?page_size=10000 | jq -r '.results|.[]|.name')
# build a list of images from tags
for j in ${IMAGE_TAGS}
do
# add each tag to list
FULL_IMAGE_LIST="${FULL_IMAGE_LIST} ${UNAME}/${i}:${j}"
done
done
# output list of all docker images
for i in ${FULL_IMAGE_LIST}
do
echo ${i}
done
Run Code Online (Sandbox Code Playgroud)
(这来自Docker 网站上的一篇文章,描述了如何使用 API。)
在本质上...
Authorization: JWT <token>给您进行的任何 API 调用https://hub.docker.com/v2/repositories/<username>/| 归档时间: |
|
| 查看次数: |
6675 次 |
| 最近记录: |