Как я могу использовать API реестра Docker для получения информации о контейнере? Получение НЕСАНКЦИОНИРОВАННО - PullRequest
3 голосов
/ 27 марта 2019

Я недавно натолкнулся на статью под названием Проверка образов Docker без их извлечения , в которой подробно рассматриваются конкретные вызовы API, необходимые для выполнения docker inspect с вызовами REST.Однако мне интересно, возможно, что-то изменилось с API-интерфейсом реестра Docker с тех пор, как была написана эта статья.

В статье дается подробное описание того, что для получения информации о контейнере необходимо выполнить три вызова REST.,В случае общедоступного реестра Docker они выглядят следующим образом:

  1. GET-запрос к auth.docker.io для получения токена

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

    В этомcase image может быть что-то вроде nginx или docker - практически любое изображение, которое вы ищите.Этот вызов 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, хотя там мне пришлось сделать что-то другоедля аутентификацииОднако у меня возникает противоположная проблема, когда я пытаюсь следовать руководству (которое я обрисовал в общих чертах в этих шагах выше) для общедоступного реестра Docker: шаг 1 дает мне токен, но этот токен бесполезен.Всякий раз, когда я пытаюсь использовать его, в Шагах 2 или 3 я получаю это обратно:

{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"docker","Action":"pull"}]}]}

Есть идеи, как заставить это работать?

1 Ответ

3 голосов
/ 01 апреля 2019

Используя следующие шаги, вы можете получить конфигурацию любого общедоступного контейнера-образа.

  1. Получить соответствующий токен для изображения.Обратите внимание, что вы должны указать полное имя изображения (официальные изображения используют репозиторий library).Таким образом, NGINX-изображение должно упоминаться как: 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: 2bcb04bdb83f7c5dc30f0edaca1609a716bda1c7d2244d4f5fbbdfef33da36 * * 10 10 * 10 10 * 10 10 * 10 10 * 10 10 * 10

    Наконец, получите конфигурацию контейнера, используя следующий запрос.В 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"
    }
    
...