Как перечислить изображения 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
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: Получение каталога
Таким образом, мне наконец удалось взломать его, но результат немного неудачный. Я кончил тем, что ... получение каталога / репозиториев каждого отдельного пользователя. Я проверил, вы все еще не можете вытащить эти РЕПО. Так что их изображения докеров безопасны как таковые. Они выглядят так: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 не реализуетv1Docker 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