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

Я использую 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?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Когда вы закручиваете реестр 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"

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

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

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

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

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

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

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

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

возвращает:

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

См. Ответ @jonathan ниже или документы API реестра здесь: https://docs.docker.com/registry/spec/api/

Если вы ищете "листинг", вы увидите, что поддержка была добавлена в версии e.

Ответ 7

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

Ответ 9

Вот хороший маленький лайнер (использует 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

Ответ 10

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

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

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

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

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

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

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

Ответ 11

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

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

curl -k -X GET https://yourusername:[email protected]/v2/_catalog

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

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

curl -k -X GET https://yourusername:[email protected]/v2/_catalog | python -m json.tool

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

Вот пример, в котором перечислены все теги всех изображений в реестре. Он также обрабатывает реестр, настроенный для аутентификации 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 @[email protected] curl -s --user $CREDS https://$THE_REGISTRY/v2/@[email protected]/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

Объяснение:

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

Ответ 16

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