Как перечислить изображения Docker в частном реестре Codefresh?



В настоящее время я использую бесплатная частная реестра Codefresh по, чтобы хранить изображения. Я использую CircleCI для моих сборок Docker, поэтому оттуда я использую docker login, чтобы я мог нажимать и тянуть к реестру Codefresh. Это прекрасно работает. Однако Codefresh только перечисляет изображения в своем веб-приложении, для которых он сделал здание, поэтому я не могу легко увидеть их каталог. Я подозреваю, что это сделано специально, чтобы пользователи придерживались Codefresh для CI. Однако, если это возможно, я хотел бы перечислить изображения, которые у меня есть в регистратура.



Я предполагаю,что этот реестр является базовой версией v2 стандартного реестра Docker. Итак, я порыскал вокруг инашел эту консольную утилиту для управления изображениями. Однако это, кажется, не работает для меня. Я не знаю, связано ли это с тем, что инструменты управления реестрами все еще незрелы (веб-поиск показывает, что они были добавлены намного позже, и есть много людей, для которых эта простая задача стала существенным предприятием), или есть что-то необычное с Codefresh.



Вот что я пытаюсь сделать:



reg -d -r r.cfcr.io -u myusername -p cfaccesstoken


(-d предназначен для отладки).



Это приводит к следующему:



2017/10/18 11:24:43 registry.ping url=https://r.cfcr.io/v2/
2017/10/18 11:24:44 registry.catalog url=https://r.cfcr.io/v2/_catalog
2017/10/18 11:25:53 registry.catalog url=https://r.cfcr.iohttps://r.cfcr.io/v2/_catalog?n=1000&last=davigsantos/davigsantos/codeflix
FATA[0075] Get https://r.cfcr.iohttps//r.cfcr.io/v2/_catalog?n=1000&last=davigsantos/davigsantos/codeflix: dial tcp: lookup r.cfcr.iohttps on 127.0.1.1:53: no such host


Предпоследняя строка содержит имя контейнера, которое я не узнаю - я надеюсь, что это публичное имя, а не то, которое я не должен видеть!



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



Я также обнаружил, что падение маркер доступа не имеет никакого значения; выходные данные точно такие же:



reg -d -r r.cfcr.io -u myusername


Что еще я могу попробовать? Я использую Mint Linux и был бы в порядке с заменой на другую утилиту, если это необходимо. Есть ли что-то неправильное в том, как я выдаю эту команду, или Codefresh запускает нестандартный реестр, несовместимый со стандартными вызовами API?



Обновление



Похоже, что Codefresh также имеет свой собственный API , хотя он, похоже, не документирован как насколько я могу судить. Выполнение операции get приводит к следующей ошибке:




Не удалось выполнить аутентификацию запроса, так как маркер не был предоставлен




Это обнадеживает, поэтому я попытаюсь выяснить, как предоставить маркер в вызове curl; веб-интерфейс Swagger, похоже, не позволяет этого. Однако я осознаю, что, если я смогу заставить API работать, он все равно не сможет перечислить мои образы Docker, поскольку они не были построены Codefresh.

Обновление 2



Я нашел некоторые статьи на блоге Codefresh, которые намекают, как аутентифицировать на API, формат заголовка таким образом:



--header "x-access-token: (token)"


Однако я получаю эту ошибку:




{"status":401,"code":"2401","name":"UNAUTHORIZED_ERROR","message": "Failed to authenticate request because token is not valid", "context": {}}




Токен, который я использую, тот же, что я использую для docker login, который работает. Я заметил, что не указал свое имя пользователя, поэтому я также добавляю этот локон вариант:



-u (user):(token)


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

Обновление 3



Судя по приведенному ниже комментарию, Docker поддерживает маркер доступа после использования login в ~/.docker/config.json.



Поэтому я попытался сделать следующее:



reg -d -r r.cfcr.io -u myusername -p dockeraccesstoken


(обратите внимание, как cfaccesstoken было изменено на dockeraccesstoken).



Теперь это возвращается гораздо быстрее (в отличие от того, чтобы казаться висящим), но возвращается ничего:



2017/10/24 10:56:16 registry.ping url=https://r.cfcr.io/v2/
2017/10/24 10:56:18 registry.catalog url=https://r.cfcr.io/v2/_catalog
Repositories for r.cfcr.io
694   3  

3 ответов:

Сначала нужно сгенерировать токен в настройках пользователя CodeFresh

Докер маркер

Далее я покажу вам, как войти в систему с терминала

curl -H 'Host: r.cfcr.io' -H 'User-Agent: ItsMe' -H 'Authorization: Basic <AUTH>' --compressed 'https://r.cfcr.io/v2/token?account=xxxx&scope=repository%3A<user>/<name>%3Apush%2Cpull&service=r.cfcr.io'

Вы можете получить <AUTH>, запустив

echo <account>:<token> | base64

Это вернет вам большой жетон

{"expires_in":43200,"issued_at":"2017-10-24T03:34:54.118390368-07:00","token":"APMm...P91"}%

Теперь вы можете использовать этот маркер для вызова API docker

$ curl -IH 'Host: r.cfcr.io' -H 'User-Agent: ItsMe' -H 'Authorization: Bearer APMm+...aRL' -X HEAD 'https://r.cfcr.io/v2/<user>/<user>/testci/blobs/sha256:c7fefcc4c54c63f32b5422ede095793eb5ff0f45ad7a22861974ec9b61e7749b'
HTTP/1.1 200 OK
Docker-Distribution-API-Version: registry/2.0
Content-Length: 22488057
Date: Tue, 24 Oct 2017 10:42:23 GMT
Content-Type: text/html
Server: Docker Registry
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

Для поиска реестра доступ ниже должен был работать

Локон -Н-Хоста: Р.cfcr.пользователь-агент Ио' -ч ': ItsMe' -ч авторизации: базовая ' -- сжатый 'https://r.cfcr.io/v2/token?account=xxxx&scope=registry%3Acatalog%3Asearch&service=r.cfcr.io'

Но это не так, как и не делает registry:catalog:* для областей. Это все равно что попасть в мишень слепыми складками и даже не знать, в каком направлении мы стоим. Вам лучше всего заставить их раскрыть вам некоторую информацию

Edit-1: Получение каталога

Таким образом, мне наконец удалось взломать его, но результат немного неудачный. Я кончил тем, что ... получение каталога / репозиториев каждого отдельного пользователя. Я проверил, вы все еще не можете вытащить эти РЕПО. Так что их изображения докеров безопасны как таковые. Они выглядят так:

EveryRepo

Edit-2: выборка всех РЕПО

После того, как мы уведомили Codefresh об этой ситуации, вот как сделать выборку. Сначала нужно сгенерировать токен, используя следующее:

curl -H 'Host: r.cfcr.io' -H 'User-Agent: MyAgent' -H 'Authorization: Basic .....' --compressed 'https://r.cfcr.io/v2/token?account=<account>&service=r.cfcr.io'

И затем, используя то же самое, мы можем запросить полный каталог:

curl -H "User-Agent: ItsMe" -H 'Authorization: Bearer <TOKEN>' 'https://r.cfcr.io/v2/_catalog?n=10' --compressed

, к сожалению, это не возможно, чтобы использовать search и catalog командами для реестра Codefresh. Реестр Codefresh (r.cfcr.io) основан на Реестре контейнеров Google (он же GCR), а реестр Google не реализует v1 Docker registry API и _catalog функцию.

Как только они это сделают, все будет работать и для реестра Codefresh.

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

Проприетарный API

Относительно Codefresh API, я не заметил, что домен g.codefresh.io такое же, как и их панели управления. Итак, чтобы пройти аутентификацию, все, что мне нужно было сделать, это войти в Панель управления - ой! Это показывает вызов https://g.codefresh.io/api/images и гораздо более сложный маркер доступа, чем у меня пользовался - возможно, это Оаут. Выглядит это так:

curl \
    -X GET \
    --header "Accept: application/json" \
    --header "x-access-token: (36chars).(143chars).(22chars)-(4chars)-(15chars)" \
    "https://g.codefresh.io/api/images"

Как я рассмотрел в вопросе, это действительно выглядит так, что конечная точка /api/images предназначена только для сборки Codefresh. Итак, это для меня-я хочу, чтобы все было в реестре.

Open API

Итак, обращаясь к открытому стандарту Docker для доступа к реестру, мой контакт поддержки сказал следующее:

Если вы хотите подключиться к cfcr.io через докера кли, вы можете.

Имя пользователя - это ваше имя пользователя на Кодфреш. Пароль-это токен, который вы можете сгенерировать в настройках пользователя - > кнопка "сгенерировать" в разделе реестра Codefresh.

Это то, что я делал до сих пор, и это работает для login, push и pull. Однако он не работает для утилиты reg в режиме ls. Либо я все еще делаю что-то не так, либо в Codefresh есть ограничения на то, как можно использовать частный реестр.

Comments

    Ничего не найдено.