Як отримати список зображень на реєстрі докера v2


203

Я використовую реєстр docker v1 і мені цікаво перейти до нової версії, v2. Але мені потрібен певний спосіб отримати список зображень, присутніх у реєстрі; наприклад, з реєстром v1 я можу виконати GET-запит, http://myregistry:5000/v1/search?і результат:

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

Але я не можу знайти в офіційній документації щось подібне, щоб отримати список зображень у реєстрі. Хтось знає спосіб це зробити на новій версії v2?


Ще недостатньо. Потрібні дати створення зображення та натискання зображення, і, сподіваємось, включити / придушити попередні версії тегів. Має бути власне веб-інтерфейс, правда? Я розмовляю з нашим адміністратором - у нас лише 2.0
Ендрю Вулф

Відповіді:


404

Для останньої (станом на 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
Звідки ви берете сертифікат?
подвійність_

3
@duality у випадку, якщо ваш реєстр використовує або самопідписаний сертифікат, або сертифікат, підписаний ненадійним кореневим сервером CA, вам потрібно надати сертифікат для згортання, щоб встановити безпечне з'єднання. Щоб встановити небезпечне з'єднання, ви можете замість цього додати прапор '--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
Nikola

2
Я не бачу такої потреби в моєму нещодавно встановленому реєстрі Docker!
Enok82

43

Отримайте каталоги

За замовчуванням 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"]}



2
Це має бути прийнятою відповіддю. Це єдина відповідь, яка пояснює, як ви обходите жахливу сторінку. На даний момент прийнята відповідь (йонатан) показує лише зображення, що починаються з "а".
користувач2394284

і як би ви отримали список тегів ceph/mds? загалом, для будь-якого сховища, визначеного /- /v2/_catalog/ceph/mdt/tags/listне працює
tymik

25

Остання версія Docker Registry доступна на веб-сайті https://github.com/docker/distribution, підтримує API API. (v2 / _каталог). Це дає можливість пошуку в сховищах

Якщо вам цікаво, ви можете спробувати CLI, який я створив, щоб створити поле для пошуку в новому дистрибутиві реєстру Docker ( https://github.com/vivekjuneja/docker_registry_cli ).


21

Для цього ми написали інструмент CLI: docker-ls Він дозволяє переглядати реєстр докера та підтримує автентифікацію через маркер або базовий auth.


21

Це зводило мене з розуму, але я нарешті зібрав усі шматки. Станом на 25.01.2015 я підтвердив, що можна реєструвати зображення в реєстрі докер V2 (саме так, як згадувався @jonatan, вище).

Я би відповідав за цю відповідь, якби у мене був представник.

Натомість я розгорну відповідь. Оскільки реєстр V2 зроблений з урахуванням безпеки, я думаю, що доречно включити, як налаштувати його за допомогою самопідписаного cert , та запустити контейнер з цим cert для того, щоб 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(як зазначено вище) повинен відповідати домену, наданому створюваному серту.


10

Встановіть реєстр: 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


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

Так, я тільки що написав це, то знайшов ваше: S, але я збережу свою відповідь, оскільки він показує, як поводитися з базовим auth теж, і це пояснює, чому це працює. Також фільтрує результат у плоский список зображень.
Крейг Рінгер

Про всяк випадок, якщо jq не знаходиться у вашому дистрибутиві Linux, знайдіть її stedolan.github.io/jq/download Це дуже корисний маленький інструмент.
ISQ

5

Я повинен був зробити те саме тут, і вищезазначені роботи, за винятком того, що я повинен був вказати дані для входу, оскільки це місцеве сховище докера.

Відповідно до вищезазначеного, але із вказанням імені користувача / пароля в URL-адресі.

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

Він повертається як неформатоване JSON.

Я проклав це через формат-пітон для зручності людського читання, якщо ви хочете мати його у такому форматі.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool

4

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


3

Якщо хтось на цьому піде далеко.

Беручи те, що інші вже говорили вище. Ось однолінійний вміст, який розміщує відповідь у форматованому текстовому файлі, json.

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

Це схоже

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

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

Далі - спосіб автоматичного видалення старих і невикористаних контейнерів.


2

Наразі функціональність реєстру пошуку докера v2 на даний момент не підтримується. Дивіться дискусію з лютого 2015 року: "пропонуйте функцію пошуку в реєстрі № 206" https://github.com/docker/distribution/isissue/206

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


2

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

Він також дозволяє видаляти невикористані зображення різними способами, як-от видалити лише старі теги з одного зображення або з усіх зображень тощо. Це зручно, коли ви заповнюєте свій реєстр з сервера CI і хочете зберігати лише останні / стабільні версії.

Він написаний python і вам не потрібно завантажувати об'ємні великі спеціальні зображення реєстру.


2

Ось приклад, у якому перераховані всі теги всіх зображень у реєстрі. Він також обробляє реєстр, налаштований для HTTP Basic auth.

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як трохи мінімалістичніше, і мені було легше інтегруватися в простий скрипт оболонки.


0

Оскільки кожен реєстр працює як контейнер, ідентифікатор контейнера має пов'язаний файл журналу ID-json.log, цей файл журналу містить vars.name = [image] та vars.reference = [tag]. Сценарій можна використовувати для їх екстраполяції та друку. Це, мабуть, один із способів переліку зображень, перенесених до реєстру V2-2.0.1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.