Docker registry 2.0 API v2


Я вытащил и настроил локальный реестр docker: 2.0

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

root@ip-10-232-0-153:~# curl -v -X GET http://localhost:5000/v2/search
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 5000 (#0)
> GET /v2/search HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:5000
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/plain; charset=utf-8
< Docker-Distribution-Api-Version: registry/2.0
< Date: Fri, 08 May 2015 00:00:45 GMT
< Content-Length: 19
<
404 page not found
* Connection #0 to host localhost left intact

Также, когда я пытаюсь свернуть localhost: 5000, я просто получаю 404:

404 page not found
9 20

9 ответов:

UPDATE (14 апреля 2016 г.): по-прежнему нет в дорожной карте распространения, но здесь есть конкретный вопрос о поиске.

UPDATE (12 ноября 2015 г.): конечные точки API по-прежнему не существуют и еще не включены в дорожную карту реестра Docker.

Проблема здесь заключается в том, что новый реестр докеров v2 пока не поддерживает эту конкретную конечную точку , как и в этом вопросе и ответе. Вы можете проверить сам источник для конечные точки маршрута, и вы увидите, что большинство конечных точек API включают в себя простые операции, такие как загрузка и маркировка, но еще не реализована конечная точка поиска. Здесь важно отметить, что реестр v2-это полностью другой проект, чем реестр v1. Он даже написан на совершенно другом языке (v1 был проектом Python, тогда как v2 использует Go, что больше соответствует остальным проектам Docker). Это заняло у меня некоторое время и серьезное чтение, чтобы поймите, какая здесь дихотомия между реестрами. Стоит посмотреть на этот конкретный вопрос Github о реестре v2 для глубокого погружения в недавнюю дискуссию о состоянии реестра v2, а также некоторую дискуссию о том, где они его принимали.

Таким образом, в реестре v2 еще нет конечной точки поиска. Вы можете перечислить свое изображение по тегу или по имени самого изображения, как указано в задаче № 8 в этой документации.

Если вы работаете в windows, вот сценарий Powershell для запроса v2/_catalog из windows с помощью базового http auth.

Https://gist.github.com/so0k/b59382ea7fd959cf7040

К вашему сведению, чтобы использовать это, вы должны docker pull distribution/registry:master вместо docker pull registry:2. версия образа registry:2 в настоящее время является 2.0.1, которая не поставляется с конечной точкой каталога.

Я думаю, что самый простой способ проверить, присутствует ли изображение docker, - это использовать Docker V2 REST API Теги list service

Пример: -

curl $CURLOPTS -H "Authorization: Bearer $token" "https://hub.docker.com:4443/v2/your-repo-name/tags/list"

Если приведенный выше результат возвращает 200Ok со списком тегов изображений, то мы знаем, что изображение существует

{"name":"your-repo-name","tags":["1.0.0.1533677221","1.0.0.1533740305","1.0.0.1535659921","1.0.0.1535665433","latest"]}

Иначе, если вы видите что-то вроде

{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"your-repo-name"}}]} 
Тогда вы точно знаете, что этого образа не существует.

В Linux (Centos 7) я использую это, пока образ реестра является единственным работающим контейнером: это будет список всех образов, помещенных в resistry/container. Я поместил его в сценарий и подправил параметры вырезания, чтобы получить то, что я хотел, поскольку длина имен изображений немного варьируется. беги как судо "script-name.sh"

grep -r -o "vars\.name=.* vars.reference=.*" /var/lib/docker/containers/* | cut -c 167-220 | sed 's/ver.*$//' | sed 's/vars\.name=//' | sed 's/ vars\.reference=/:/' | sort -u

Сегодня я попробовал изображение registry:master, но его не существует.

xotl@xotl-VM:~$ docker run registry:master
Unable to find image 'registry:master' locally
Pulling repository docker.io/library/registry
Tag master not found in repository docker.io/library/registry
xotl@xotl-VM:~$ 

Теперь вы можете запустить registry:2 и получите конечную точку.

Если я посещаю http://localhost:5000/v2/_catalog в моей машине, я могу увидеть этот выход {"repositories":["ubuntu"]}, который является правильным. Также попробовал http://localhost:5000/v2/ubuntu/tags/list и получил этот ответ {"name":"ubuntu","tags":["latest"]}, так что это работает.

Вы можете взять взглянуть на документы.

@Xotl
curl -X GET registry.com:5000/v2/lashou/centos/tags/list
{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"lashou/centos"}}]}

Docker registry search functionality v2 не поддерживается на момент написания данной статьи. См. обсуждение с февраля 2015 года: https://github.com/docker/distribution/issues/206

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

Ubuntu 14.04.3 LTS, CoreOS 723.3.0 реестр github.com/docker/distribution П2.1.1

Я написал скрипт с именем view-private-registry для поиска registry V2 REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY. Он работает на любой из моих систем, в которой установлен каталог REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY. Дайте мне знать о любых изменениях, которые вы сделаете, спасибо.

Сценарий: https://github.com/BradleyA/Search-docker-registry-v2-script.1.0

#!/bin/bash
# %W% %G% %U%
#
#       View private registry,
#               if REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY is mounted on your system
#
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY="/mnt/three/docker-registry/registry-data"
#
find $REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY -print | \
    grep 'v2/repositories' | \
    grep 'current' | \
    grep -v 'link' | \
    sed -e 's/\/_manifests\/tags\//:/' | \
    sed -e 's/\/current//' | \
    sed -e 's/^.*repositories\//    /' | \
    sort > /tmp/a1
cat /tmp/a1
wc -l /tmp/a1 > /tmp/a2
echo "Number of images: `cat /tmp/a2 | awk {'print $1'}`"
echo "Disk space used:  `du -hs $REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY`"
rm /tmp/a1 /tmp/a2`

Вывод:

`$ ./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

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

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

Правильно.

Это просто пример реализации, которая работает для получения некоторого списка изображений. Да предполагается, что это общий запуск registry2.0. например $ sudo docker run --name=myregistry-d-p port: port myregistry: 1.0.

Суть в том, что каждый контейнер имеет файл журнала ...некоторые-путь / контейнеры... ID-json.бревно. В этом файле хранится информация об изображениях, помещенных в работающий реестр. Таким образом, он может быть использован для экстраполяции списка изображений. Так же сыро, как и оно - это лучше, чем ничего. Не решение проблемы поиска/каталога, а способ получить список изображений. Это очень индивидуальный обходной путь для решения проблемы в ожидании "официального" исправления.