Я недавно натолкнулся на статью под названием Проверка образов Docker без их извлечения , в которой подробно рассматриваются конкретные вызовы API, необходимые для выполнения docker inspect
с вызовами REST.Однако мне интересно, возможно, что-то изменилось с API-интерфейсом реестра Docker с тех пор, как была написана эта статья.
В статье дается подробное описание того, что для получения информации о контейнере необходимо выполнить три вызова REST.,В случае общедоступного реестра Docker они выглядят следующим образом:
GET-запрос к auth.docker.io для получения токена
curl "https://auth.docker.io/token?scope=repository:<image>:pull&service=registry.docker.io"
В этомcase 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
.Это строка дайджеста, которую мы используем в последнем запросе.
Наконец 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"}]}]}
Есть идеи, как заставить это работать?