Я пытаюсь написать код, который по сути может сделать docker inspect
для изображений, опубликованных в частной артефакте JFrog, без необходимости извлекать сами изображения.Я использовал руководство под названием Проверка образов Docker без pull для разбивки вызовов API.Руководство использует общедоступный реестр Docker Hub в качестве своей базы, а не Artifactory, который немного отличается.
В основном необходимо выполнить 3 вызова API:
- Сначалаполучить токен
- Затем получить «дайджест» для данного изображения / тега
- Наконец получить конфигурацию, соответствующую этому дайджесту
У меня есть Artifactory, настроенный для разрешенияанонимный доступ для чтения.Таким образом, любой, кто знает URL, может сделать docker pull
без предоставления учетных данных, и это работает.Я подтвердил это.
Поскольку он разрешает анонимный доступ, я сначала предположил, что, возможно, я мог бы пропустить вызов API № 1 (получение токена) и перейти непосредственно к вызову API № 2 (поиск дайджеста) без предоставления дайджеста.знакОднако, это не так.В этом случае Artifactory возвращает несанкционированную ошибку.
Затем я подумал, хорошо, хорошо, я просто попаду в конечную точку токена.Но вместо auth.docker.io
я изменю его на поддомен моего сервера Artifactory, а POST на конечную точку /token
.Это не сработало.Затем я обнаружил эту часть официального кода ContainerD , который на самом деле имеет условный регистр, специально разработанный для встроенной в JFrog Artifactory.
Похоже, что Artifactory возвращает 401 (Unauthorized), когда вы пытаетесьPOST к конечной точке /token
, и, кроме того, клиент Docker знает об этом, поэтому возвращается к попытке запроса GET.Но вот где это становится немного неясным для меня.Я не программист на Голанге, поэтому мне трудно понять, что происходит в коде Docker CLI Go.
Я предполагал, что это просто изменение POST на GET, но в остальном используется тот же URL(т.е. /v2/token
).Тем не менее, это не работает.Когда я пытаюсь достичь этой конечной точки, я все еще получаю НЕСАНКЦИОНИРОВАННЫЙ ответ.Если посмотреть далее на этот код ContainerD , похоже, что он может устанавливать базовую аутентификацию с использованием имени пользователя и секрета.Но я не уверен, какими будут эти значения, поскольку это делается с помощью анонимного доступа.Ясно, что он достигает некоторой конечной точки токена на моем сервере Artifactory, поскольку запуск docker pull
успешен.Мне просто интересно, как на самом деле выглядит резервный вызов API?А какие параметры / заголовки / аутентификацию нужно в него передать?