Cómo obtener una lista de imágenes en Docker Registry v2

204

Estoy usando Docker Registry v1 y estoy interesado en migrar a la versión más reciente, v2. Pero necesito alguna forma de obtener una lista de imágenes presentes en el registro; por ejemplo con el registro v1 puedo ejecutar una solicitud GET parahttp://myregistry:5000/v1/search? y el resultado es:

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

Pero no puedo encontrar en la documentación oficial algo similar para obtener una lista de imágenes en el registro. ¿Alguien sabe cómo hacerlo en la nueva versión v2?

kikicarbonell
fuente
Aún no es suficiente. Necesita las fechas de la creación de la imagen y la inserción de la imagen, y es de esperar que incluya / suprima las versiones de etiquetas anteriores. También debe haber una interfaz web real, ¿verdad? Estoy hablando con nuestro administrador: solo tenemos 2.0
Andrew Wolfe

Respuestas:

405

Para obtener la última versión (a partir del 31/07/2015) de Registry V2, puede obtener esta imagen de DockerHub:

docker pull distribution/registry:master

Listar todos los repositorios (efectivamente imágenes):

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

Listar todas las etiquetas para un repositorio:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
jonatan
fuente
3
¿De dónde obtienes el certificado?
dualidad_
3
@duality en caso de que su registro esté utilizando un certificado autofirmado o un certificado firmado por una CA raíz no confiable, debe proporcionar el certificado para que se enrolle para establecer una conexión segura. Para hacer una conexión insegura, puede agregar la bandera '--seguro' en su lugar.
jonatan
55
-k, --seguro (SSL)
Ilja
9
El resultado predeterminado solo muestra un registro de 100 imágenes, pero si necesita mostrar más, puede paginar el resultado con esta consulta: http://<registry-url>/v2/_catalog?n=<count>con recuento, por ejemplo, 2000.
kikicarbonell
17
Si el registro está protegido con contraseña, usecurl -u <user>:<pass> -X GET ...
nsantos
77

puedes buscar en

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

Abhishek Jaiswal
fuente
44
... a partir de hace poco me gustaría agregar que se requiere https en lugar de solo http
Nikola
2
¡No veo tanta necesidad de mi registro Docker recientemente instalado!
Enok82
44

Obtenga catálogos

Por defecto, la API de registro devuelve 100 entradas de catálogo, ahí está el código :

Cuando riza la API de registro:

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

equivale a :

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

Este es un método de paginación.

Cuando la suma de entradas supera los 100, puede hacerlo de dos maneras:

Primero : dar un número mayor

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

Sencond : analiza la siguiente url del enlazador

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

Un elemento de enlace contenido en el encabezado de respuesta:

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

encabezado de respuesta:

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

El elemento de enlace tiene la última entrada de esta solicitud, luego puede solicitar la siguiente 'página':

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

Si el encabezado de respuesta contiene un elemento de enlace , puede hacerlo en un bucle .

Obtener imágenes

Cuando obtienes el resultado del catálogo, es como sigue:

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

Puedes obtener las imágenes en cada catálogo:

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

devoluciones:

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

litanhua
fuente
1
100 entradas definidas aquí
litanhua
2
Esta debería ser la respuesta aceptada. Es la única respuesta que explica cómo evitar la temida paginación. La respuesta actualmente aceptada (jonatan) solo muestra imágenes que comienzan con "a".
user2394284
y cómo obtendrías la lista de etiquetas ceph/mds? en general, para cualquier repositorio definido con /- /v2/_catalog/ceph/mdt/tags/listno funciona
tymik
21

Escribimos una herramienta CLI para este propósito: docker-ls Le permite navegar por un registro de docker y admite autenticación a través de token o autenticación básica.

Christian Speckner
fuente
21

Esto me ha vuelto loco, pero finalmente puse todas las piezas juntas. A partir del 25/01/2015, he confirmado que es posible enumerar las imágenes en el registro docker V2 (exactamente como @jonatan mencionó anteriormente).

Volvería a votar esa respuesta, si tuviera el representante para ello.

En cambio, ampliaré la respuesta. Dado que el registro V2 está hecho con la seguridad en mente, creo que es apropiado incluir cómo configurarlo con un certificado autofirmado y ejecutar el contenedor con ese certificado para poder realizar una llamada https con ese certificado:

Este es el script que realmente uso para iniciar el registro:

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

Esto puede ser obvio para algunos, pero siempre me confundo con claves y certificados. El archivo al que se debe hacer referencia para realizar la llamada que @jonaton menciona arriba **, es el dominio.crt mencionado anteriormente. (Desde que puse domain.crt /root, hice una copia en el directorio de usuarios donde se podía acceder).

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

** El comando anterior ha cambiado: -X GET en realidad no funcionó cuando lo probé.

Nota: https://myregistry:5000(como arriba) debe coincidir con el dominio otorgado al certificado generado.

Cognitiaclaeves
fuente
7

Aquí hay un pequeño y lindo delineador (usa JQ) para imprimir una lista de Repos y etiquetas asociadas.

Si no lo ha jqinstalado, puede usar: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
fuente
Argh, acabo de escribir esto y luego encontré el tuyo: S pero mantendré mi respuesta porque muestra cómo manejar la autenticación básica también y explica por qué funciona. También filtra el resultado en una lista de imágenes planas.
Craig Ringer el
Solo en caso de que jq no esté en su distribución de Linux, consígalo stedolan.github.io/jq/download Es una pequeña herramienta muy útil.
ISQ
5

Tuve que hacer lo mismo aquí y lo anterior funciona, excepto que tuve que proporcionar detalles de inicio de sesión, ya que era un repositorio local de acopladores.

Es según lo anterior pero con el suministro del nombre de usuario / contraseña en la URL.

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

Vuelve como JSON sin formato.

Lo canalicé a través del formateador de python para facilitar la lectura humana, en caso de que desee tenerlo en este formato.

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

Usando los puntos finales "/ v2 / _catalog" y "/ tags / list", realmente no puede enumerar todas las imágenes. Si empujó algunas imágenes diferentes y las etiquetó como "más recientes", ¡realmente no puede enumerar las imágenes antiguas! Todavía puede extraerlos si se refiere a ellos utilizando el resumen "docker pull ubuntu @ sha256: ac13c5d2 ...". Entonces la respuesta es: no hay forma de enumerar imágenes, solo puede enumerar etiquetas que no son lo mismo

usuario1616472
fuente
3

Si algunos llegan hasta aquí.

Tomando lo que otros ya han dicho anteriormente. Aquí hay una línea que pone la respuesta en un archivo de texto formateado, json.

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

Esto parece

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

Es posible que deba cambiar el `? N = xxxx 'para que coincida con la cantidad de contenedores que tiene.

El siguiente es un modo de eliminar automáticamente los contenedores viejos y no utilizados

nelaaro
fuente
2

Escribí una herramienta de línea de comandos fácil de usar para enumerar imágenes de varias maneras (como enumerar todas las imágenes, enumerar todas las etiquetas de esas imágenes, enumerar todas las capas de esas etiquetas).

También le permite eliminar imágenes no utilizadas de varias maneras, como eliminar solo las etiquetas más antiguas de una sola imagen o de todas las imágenes, etc. Esto es conveniente cuando está completando su registro desde un servidor CI y desea mantener solo las versiones más recientes / estables.

Está escrito en Python y no necesita que descargue grandes y voluminosas imágenes de registro personalizadas.

anoxis
fuente
2

Aquí hay un ejemplo que enumera todas las etiquetas de todas las imágenes en el registro. También maneja un registro configurado para autenticación básica 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"][]'

Explicación:

  • extraer nombre de usuario: contraseña de .docker / config.json
  • hacer una solicitud https al registro para enumerar todos los "repositorios"
  • filtrar el resultado de json a una lista plana de nombres de repositorio
  • para cada nombre de repositorio:
  • hacer una solicitud https al registro para enumerar todas las "etiquetas" para ese "repositorio"
  • filtrar el flujo de objetos json resultantes, imprimiendo "repositorio": pares de "etiquetas" para cada etiqueta encontrada en cada repositorio
Craig Ringer
fuente
1

Estos hilos datan de mucho tiempo, las herramientas más recientes que uno debería considerar son skopeoy crane.

skopeoadmite la firma y tiene muchas otras características, aunque cranees un poco más minimalista y me resultó más fácil integrarlo en un simple script de shell.

desarrollador de errores
fuente
0

Dado que cada registro se ejecuta como un contenedor, la ID del contenedor tiene un archivo de registro asociado ID-json.log. Este archivo de registro contiene vars.name = [image] y vars.reference = [tag]. Se puede usar un script para extrapolar e imprimir estos. Este es quizás un método para enumerar las imágenes enviadas al registro V2-2.0.1.

Phil Pinkerton
fuente