【问题标题】:How can I use the Docker Registry API to pull information about a container? Getting UNAUTHORIZED如何使用 Docker Registry API 来提取有关容器的信息?未经授权
【发布时间】:2019-03-27 20:48:31
【问题描述】:

不久前我看到一篇题为 Inspecting Docker Images without pulling them 的文章,该文章深入了解了本质上使用 REST 调用执行 docker inspect 所需的特定 API 调用的本质。但是,我想知道自那篇文章撰写以来,Docker 注册表 API 是否发生了一些变化。

本文详细介绍了您需要进行三个 REST 调用才能获取有关容器的信息。在公共 Docker 注册表的情况下,它们如下所示:

  1. 对 auth.docker.io 的 GET 请求以获取令牌

    curl "https://auth.docker.io/token?scope=repository:<image>:pull&service=registry.docker.io"
    

    在这种情况下,image 可能类似于 nginxdocker - 基本上是您正在查找的任何图像。此 REST 调用返回一个令牌以在后续请求中使用。

  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>/manifests/<tag>"
    

    这里image 与第1 步相同,tag 可能类似于latest。此调用返回一些 JSON;关键是我们需要提取.config.digest 的值。这是我们在最终请求中使用的摘要字符串。

  3. 最后是一个获取容器配置的 GET 请求,使用我们在步骤 2 中收到的摘要

    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"}]}]}

关于如何让它发挥作用的任何想法?

【问题讨论】:

  • 你使用的图片参数是什么?
  • 这似乎并不重要,因为它们都会产生在后续步骤中不起作用的令牌。出于测试目的,我一直在尝试 dockernginx

标签: docker curl docker-registry


【解决方案1】:

使用以下步骤,您可以检索任何公共容器映像的配置。

  1. 获取图像的相应令牌。请注意,您必须指定图像的全名(官方图像使用library 存储库)。因此,NGINX image 应称为:library/nginx

    curl \
        --silent \
        "https://auth.docker.io/token?scope=repository:library/nginx:pull&service=registry.docker.io" \
        | jq -r '.token'
    

    为简洁起见缩短了令牌: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXV...

  2. 从清单中检索图像摘要。对于这个请求,你还需要指定一个有效的标签(这个例子使用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

  3. 最后,通过以下请求获取容器配置。在 URL 中,必须指定第二步的摘要。

    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"
    }
    

【讨论】:

  • 添加 library/ 前缀是我所缺少的。谢谢你。我会尽快奖励赏金。
  • 如果您有时间,我在这里有一个密切相关的问题:stackoverflow.com/q/55484348
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2021-08-26
  • 2016-09-05
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多