Как получить список изображений на Docker Registry v2

204

Я использую Docker Registry v1, и я заинтересован в переходе на более новую версию, v2. Но мне нужен какой-то способ получить список изображений, присутствующих в реестре; например, с реестром v1 я могу выполнить запрос GET http://myregistry:5000/v1/search?и в результате:

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}

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

kikicarbonell
источник
Все еще недостаточно. Нужны даты создания и отправки изображения, и, надеюсь, включить / отключить предыдущие версии тегов. Должен быть настоящий веб-интерфейс, верно? Я разговариваю с нашим администратором - у нас только 2,0
Эндрю Вулф

Ответы:

405

Для последней (по состоянию на 2015-07-31) версии Registry V2 вы можете получить этот образ из DockerHub:

docker pull distribution/registry:master

Перечислите все репозитории (фактически изображения):

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

Перечислите все теги для хранилища:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
Йонатан
источник
3
Где вы получаете сертификат?
Duality_
3
@duality, если в вашем реестре используется самозаверяющий сертификат или сертификат, подписанный ненадежным корневым центром сертификации, вам необходимо предоставить сертификат для скручивания, чтобы установить безопасное соединение. Чтобы создать небезопасное соединение, вы можете вместо этого добавить флаг --insecure.
Джонатан
5
-k, --insecure (SSL)
Илья
9
В результате по умолчанию отображается только 100 изображений, но если вам нужно показать больше, вы можете разбить результат на страницы с помощью этого запроса: http://<registry-url>/v2/_catalog?n=<count>например, 2000.
kikicarbonell
17
Если реестр защищен паролем, используйтеcurl -u <user>:<pass> -X GET ...
nsantos
77

Вы можете искать на

http: // <ip/hostname>: <port>/ v2 / _catalog

Абхишек Джайсвал
источник
4
... с недавнего времени я просто хотел бы добавить, что требуется https, а не просто http
Никола
2
Я не вижу такой необходимости в моем недавно установленном реестре Docker!
Enok82
44

Получить каталоги

По умолчанию, реестр API возвращает 100 записей каталога, есть код :

Когда вы скручиваете API реестра:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

это эквивалентно :

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

Это метод пагинации.

Когда сумма записей превышает 100, вы можете сделать это двумя способами:

Первый : дать большее число

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

Sencond : разбор следующего линкера

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

Элемент ссылки, содержащийся в заголовке ответа:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

заголовок ответа:

Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

Элемент link имеет последнюю запись этого запроса, затем вы можете запросить следующую «страницу»:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

Если заголовок ответа содержит элемент ссылки , вы можете сделать это в цикле .

Получить изображения

Когда вы получаете результат каталога, он выглядит следующим образом:

{ "repositories": [ "busybox", "ceph/mds" ] }

Вы можете получить изображения в каждом каталоге:

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

возвращает:

{"name":"busybox","tags":["latest"]}

litanhua
источник
1
100 записей, определенных здесь
литанхуа
2
Это должен быть принятый ответ. Это единственный ответ, который объясняет, как вы обходите ужасную нумерацию страниц. В настоящее время принятый ответ (jonatan) показывает только изображения, начинающиеся с «a».
user2394284
и как бы вы получили список тегов для ceph/mds? в общем, для любого репозитория, определенного с /- /v2/_catalog/ceph/mdt/tags/listне работает
tymik
25

Последняя версия Docker Registry, доступная по адресу https://github.com/docker/distribution, поддерживает Каталог API. (v2 / _catalog). Это позволяет осуществлять поиск в хранилищах.

Если вам интересно, вы можете попробовать CLI реестра образов Docker, который я создал, чтобы упростить использование функций поиска в новом дистрибутиве Docker Registry ( https://github.com/vivekjuneja/docker_registry_cli )

ZephyrPLUSPLUS
источник
21

Для этой цели мы написали инструмент CLI: docker-ls. Он позволяет просматривать реестр Docker и поддерживает аутентификацию с помощью токена или базовой аутентификации.

Кристиан Спекнер
источник
21

Это сводило меня с ума, но я наконец собрал все воедино. По состоянию на 25.01.2015 я подтвердил, что можно перечислить изображения в реестр Docker V2 (в точности как упомянуто выше @jonatan).

Я бы проголосовал за этот ответ, если бы у меня был представитель для него.

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

Это скрипт, который я на самом деле использую для запуска реестра:

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

Это может быть очевидно для некоторых, но я всегда путаюсь с ключами и сертификатами. Файл, на который нужно сослаться для упоминания вызова @jonaton выше **, - это домен domain.crt, указанный выше. (Так как я поместил domain.crt /root, я сделал копию в пользовательский каталог, где он может быть доступен.)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

** Команда выше была изменена: -X GET на самом деле не работал, когда я попробовал.

Примечание: https://myregistry:5000(как указано выше) должен соответствовать домену, указанному для сгенерированного сертификата.

Cognitiaclaeves
источник
7

Вот хороший маленький лайнер (использует JQ) для распечатки списка Repos и связанных тегов.

Если вы не jqустановили, вы можете использовать:brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list
Jeef
источник
аааа, я только что написал это, а потом нашел ваш: S, но я оставлю свой ответ, потому что он показывает, как обрабатывать Basic Auth, и объясняет, почему он работает Также фильтрует результат в плоский список изображений.
Крейг Рингер
Просто на случай, если jq отсутствует в вашем дистрибутиве Linux, возьмите его stedolan.github.io/jq/download Это очень полезный маленький инструмент.
ISQ
5

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

Это как указано выше, но с указанием имени пользователя / пароля в URL.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

Это возвращается как неформатированный JSON.

Я передал его через средство форматирования python для удобства чтения на случай, если вы захотите иметь его в этом формате.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool
Chai
источник
4

Используя конечные точки "/ v2 / _catalog" и "/ tags / list", вы не сможете составить список всех изображений. Если вы нажали несколько разных изображений и отметили их как «последние», вы не сможете перечислить старые изображения! Вы по-прежнему можете тянуть их, если ссылаетесь на них с помощью дайджеста «docker pull ubuntu @ sha256: ac13c5d2 ...». Таким образом, ответ - нет возможности перечислять изображения, вы можете перечислить только теги, которые не совпадают

user1616472
источник
3

Если некоторые на это далеко.

Принимая то, что другие уже сказали выше. Вот строчка, которая помещает ответ в текстовый файл в формате json.

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

Это выглядит как

{
  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]
}

Возможно, вам придется изменить `? N = xxxx ', чтобы соответствовать количеству контейнеров, которые у вас есть.

Следующим является способ автоматического удаления старых и неиспользуемых контейнеров.

nelaaro
источник
2

Функциональность Docker search Registry v2 на данный момент не поддерживается. Смотрите обсуждение с февраля 2015 года: «Предложить функцию поиска в реестре # 206» https://github.com/docker/distribution/issues/206

Я написал скрипт, который вы можете найти: https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 Это не красиво, но он получает информацию, необходимую из частного реестра.

Брэдли Аллен
источник
2

Я написал простой в использовании инструмент командной строки для перечисления изображений различными способами (например, список всех изображений, список всех тегов этих изображений, список всех слоев этих тегов).

Он также позволяет удалять неиспользуемые изображения различными способами, например удалять только старые теги одного изображения или из всех изображений и т. Д. Это удобно, когда вы заполняете реестр с сервера CI и хотите сохранить только последние / стабильные версии.

Он написан на python и не требует загрузки больших пользовательских образов реестра.

anoxis
источник
2

Вот пример, в котором перечислены все теги всех изображений в реестре. Он также обрабатывает реестр, настроенный для аутентификации HTTP Basic.

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

Объяснение:

  • извлечь имя пользователя: пароль из .docker / config.json
  • сделать https запрос в реестр, чтобы перечислить все «репозитории»
  • фильтровать результат json в плоский список имен репозиториев
  • для каждого имени хранилища:
  • сделать запрос https в реестр, чтобы перечислить все «теги» для этого «хранилища»
  • фильтровать поток результирующих объектов json, печатая пары «репозиторий»: «тег» для каждого тега, найденного в каждом репозитории
Крейг Рингер
источник
1

Эта тема восходит к давно, большинство последних инструментов, которые следует учитывать, skopeoи crane.

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

errordeveloper
источник
0

Поскольку каждый реестр работает как контейнер, у идентификатора контейнера есть связанный файл журнала ID-json.log, этот файл журнала содержит vars.name = [image] и vars.reference = [tag]. Сценарий может быть использован для экстраполяции и печати. Это, пожалуй, один из способов вывода изображений, помещенных в реестр V2-2.0.1.

Фил Пинкертон
источник