Как я могу использовать Docker Registry API для получения информации о контейнере? Получение неавторизованного

Некоторое время назад я наткнулся на статью под названием Проверка образов 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"
    

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

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

Любые идеи о том, как заставить это работать?


person soapergem    schedule 27.03.2019    source источник
comment
Какой параметр изображения вы используете?   -  person prd    schedule 01.04.2019
comment
Это не имеет значения, поскольку все они производят токены, которые не работают на последующих этапах. В целях тестирования я пробовал и docker, и nginx.   -  person soapergem    schedule 01.04.2019


Ответы (1)


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

  1. # P2 #
    curl \
        --silent \
        "https://auth.docker.io/token?scope=repository:library/nginx:pull&service=registry.docker.io" \
        | jq -r '.token'
    
    # P3 #
  2. # P4 #
    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'
    
    # P5 #
  3. # P6 #
    curl \
        --silent \
        --location \
        --header "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXV..." \
        "https://registry-1.docker.io/v2/library/nginx/blobs/sha256:2bcb04bdb83f7c5dc30f0edaca1609a716bda1c7d2244d4f5fbbdfef33da366c" \
        | jq -r '.container_config'
    
    # P7 #
    {
        "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 <[email protected]>"
        },
        "StopSignal": "SIGTERM"
    }
    
person prd    schedule 01.04.2019
comment
Мне не хватало префикса library/. Спасибо. Я награжу награду, как только мне это будет позволено. - person soapergem; 01.04.2019
comment
Если у вас есть время, у меня есть тесно связанный с этим вопрос: stackoverflow.com/q/55484348 - person soapergem; 03.04.2019