Как получить список образов в реестре Docker v2

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

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

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


person enrique-carbonell    schedule 06.07.2015    source источник
comment
Все еще недостаточно. Нужны даты создания и отправки изображения, и, надеюсь, включить / отключить предыдущие версии тегов. Должен же быть и настоящий веб-интерфейс, верно? Я разговариваю с нашим админом - у нас всего 2.0   -  person Andrew Wolfe    schedule 11.02.2016
comment
hub.docker.com, похоже, имеет другой API, например для вывода списка тегов репозитория: curl -sSX GET 'https://hub.docker.com/v2/repositories/library/php/tags?page_size=100'. Или вы можете использовать docker-hub-api.   -  person x-yuri    schedule 12.03.2021


Ответы (16)


Для последней (по состоянию на 31.07.2015) версии 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"]}

Если реестр требует аутентификации, вы должны указать имя пользователя и пароль в команде curl

curl -X GET -u <user>:<pass> https://myregistry:5000/v2/_catalog
curl -X GET -u <user>:<pass> https://myregistry:5000/v2/ubuntu/tags/list
person jonatan    schedule 31.07.2015
comment
Где взять сертификат? - person duality_; 26.01.2017
comment
@duality, если в вашем реестре используется самозаверяющий сертификат или сертификат, подписанный ненадежным корневым центром сертификации, вам необходимо предоставить сертификат для curl, чтобы установить безопасное соединение. Чтобы создать небезопасное соединение, вы можете вместо этого добавить флаг --insecure. - person jonatan; 26.01.2017
comment
-k, --insecure (SSL) - person Ilja; 23.03.2017
comment
Также проверьте, какой порт использует docker-registry на самом хосте. Он может быть отображен на 5000 внутри, но снаружи, используя другой. Для меня это было так, поскольку он использовал 443: 5000, а затем вместо этого команда работала с 443. - person gorjanz; 16.11.2017
comment
Результат по умолчанию показывает только 100 записей изображений, но если вам нужно показать больше, вы можете разбить результат на страницы с помощью этого запроса: http://<registry-url>/v2/_catalog?n=<count> со счетчиком, например 2000. - person enrique-carbonell; 17.04.2018
comment
Если реестр защищен паролем, используйте curl -u <user>:<pass> -X GET ... - person nsantos; 04.03.2019
comment
Мне не требуется номер порта для доступа к azurecr.io - person Heath Raftery; 08.05.2019

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

http: // _ 1_: <port> / v2 / _catalog

person Abhishek Jaiswal    schedule 14.02.2017
comment
... с недавнего времени я просто хотел бы добавить, что https требуется вместо просто http - person Nikola; 16.05.2017
comment
Я не вижу такой необходимости в моем недавно установленном реестре Docker! - person Enok82; 18.09.2018

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

По умолчанию 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: проанализировать следующий URL-адрес компоновщика

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"

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

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"]}

person litanhua    schedule 23.03.2017
comment
Это должен быть принятый ответ. Это единственный ответ, который объясняет, как избавиться от ужасной разбивки на страницы. В принятом на данный момент ответе (jonatan) отображаются только изображения, начинающиеся с. - person user2394284; 15.10.2018
comment
и как получить список тегов для ceph/mds? в общем, для любого репозитория, определенного с помощью / - /v2/_catalog/ceph/mdt/tags/list не работает - person tymik; 18.11.2019

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

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

person ZephyrPLUSPLUS    schedule 28.07.2015

Это сводило меня с ума, но я наконец собрал все воедино. По состоянию на 25 января 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 (как указано выше) должен соответствовать домену, указанному для сгенерированного сертификата.

person Cognitiaclaeves    schedule 25.01.2016

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

person Christian Speckner    schedule 03.03.2016

Установите реестр: 2.1.1 или новее (последний можно проверить здесь) и используйте GET / v2 / _catalog, чтобы получить список.

https://github.com/docker/distribution/blob/master/docs/spec/api.md#listing-repositories

Список всех изображений с помощью примера сценария Shell: https://gist.github.com/OndrejP/a2386d08e5308b0776c0

person Ondrej Prochazka    schedule 22.09.2015

Вот симпатичный маленький лайнер (использует 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
person Jeef    schedule 27.11.2018
comment
argh, я просто написал это, а затем нашел ваше: S, но я сохраню свой ответ, потому что он также показывает, как обрабатывать базовую аутентификацию, и объясняет, почему это работает. Также фильтрует результат в список плоских изображений. - person Craig Ringer; 30.01.2019
comment
На всякий случай, если jq отсутствует в вашем дистрибутиве Linux, загрузите его stedolan.github.io/jq/ скачать Это очень полезный маленький инструмент. - person ISQ; 13.04.2019

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

Это как указано выше, но с указанием имени пользователя и пароля в 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
person Chai Ang    schedule 13.09.2018

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

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-объектов результатов, выводя пары «репозиторий»: «тег» для каждого тега, найденного в каждом репозитории.
person Craig Ringer    schedule 30.01.2019
comment
Отлично. Простое использование API и простых старых инструментов уровня оболочки. - person Daniel Holmes; 25.05.2021

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

person user1616472    schedule 13.06.2019

Если кто-то зайдет так далеко.

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

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

Это похоже

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

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

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

person nelaaro    schedule 19.07.2018

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

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

Пример вывода из view-private-registry:

$ view-private-registry`
busybox:latest
gcr.io/google_containers/etcd:2.0.9
gcr.io/google_containers/hyperkube:v0.21.2
gcr.io/google_containers/pause:0.8.0
google/cadvisor:latest
jenkins:latest
logstash:latest
mongo:latest
nginx:latest
python:2.7
redis:latest
registry:2.1.1
stackengine/controller:latest
tomcat:7
tomcat:latest
ubuntu:14.04.2
Number of images:   16
Disk space used:    1.7G    /mnt/three/docker-registry/registry-data
person Bradley Allen    schedule 12.02.2016

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

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

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

person anoxis    schedule 11.02.2017

Эти потоки существуют давно, самые последние инструменты, которые следует учитывать, - это skopeo и _ 2_.

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

person errordeveloper    schedule 21.05.2020
comment
Это отличные инструменты, особенно если у вас есть особые требования к аутентификации (например, ActiveDirectory). - person Max Leske; 02.10.2020

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

person Phil Pinkerton    schedule 04.08.2015