¿Cómo puedo enumerar todas las etiquetas de una imagen de Docker en un registro remoto?

Resuelto Johan asked hace 9 años • 29 respuestas

¿Cómo puedo enumerar todas las etiquetas de una imagen de Docker en un registro de Docker remoto usando la CLI (preferida) o curl?

Preferiblemente sin extraer todas las versiones del registro remoto. Sólo quiero enumerar las etiquetas.

Johan avatar Feb 04 '15 18:02 Johan
Aceptado

Actualización: Docker ha dejado de utilizar la API Docker Hub v1 . Para recuperar etiquetas usando la API v2 , use, por ejemplo

wget -q -O - "https://hub.docker.com/v2/namespaces/library/repositories/debian/tags?page_size=100" | grep -o '"name": *"[^"]*' | grep -o '[^"]*$'

Nota: Los resultados se limitarán a las 100 etiquetas más nuevas. Para obtener las siguientes 100 etiquetas, configure la URL en https://.../tags?page_size=100&page=2etc.

Para imágenes que no sean las imágenes oficiales de Docker, reemplácelas librarycon el nombre del usuario/organización.

La URL https://hub.docker.com/v2/repositories/{namespace}/{repository}/tagstambién funciona en este momento, sin embargo, en la especificación API no queda claro si es legal.

(Si lo ha jqinstalado, puede reemplazar los comandos kludgy grep con jq -r '.results[].name'.)


Respuesta original (API v1, ya no es compatible):

Obtuve la respuesta de aquí . ¡Muchas gracias! :)

Solo script de una línea: (encuentra todas las etiquetas de Debian)

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'

ACTUALIZACIÓN Gracias por el consejo de @degelf. Aquí está el script de shell.

#!/bin/bash

if [ $# -lt 1 ]
then
cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]
then
    tags=` echo "${tags}" | grep "$2" `
fi

echo "${tags}"

Puede simplemente crear un nuevo nombre de archivo, dockertagsen /usr/local/bin (o agregar un entorno PATH a su .bashrc/ .zshrc) y poner ese código en él. Luego agregue los permisos ejecutables ( chmod +x dockertags).

Uso:

dockertags ubuntu ---> enumera todas las etiquetas de ubuntu

dockertags php apache ---> enumera todas las etiquetas php que contienen 'apache'

Vi.Ci avatar Sep 12 '2016 16:09 Vi.Ci

A partir de Docker Registry V2, GETbasta con lo siguiente:

GET /v2/<name>/tags/list

Consulte los documentos para obtener más información.

PD: Si su registro de imágenes requiere autenticación y recibe un mensaje de error con el texto "no autorizado", entonces hay una solución más abajo en esta página aquí .

Yan Foto avatar Sep 14 '2016 08:09 Yan Foto

Si desea utilizar la API de Docker Registry v2, enumera las etiquetas por páginas. Para enumerar todas las etiquetas de una imagen, es posible que desee agregar un parámetro de tamaño de página grande a la URL, por ejemplo

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'
0xCC avatar May 07 '2017 10:05 0xCC

La API V2 de Docker Registry requiere un token de portador de OAuth con los reclamos apropiados. En mi opinión, la documentación oficial es bastante vaga sobre el tema. Para que otros no pasen por el mismo dolor que yo, ofrezco la siguiente docker_tagsfunción.

La versión más reciente docker_tagsse puede encontrar en mi GitHub Gist: "Listar etiquetas de imágenes de Docker usando bash" . Nota del editor: Las versiones han divergido.

La función docker_tags depende de jq . Si estás jugando con JSON, probablemente ya lo tengas.

#!/usr/bin/env bash
set -eu -o pipefail
docker_tags() {
    item="$1"
    case "$item" in
        */*) :;; # namespace/repository syntax, leave as is
        *) item="library/$item";; # bare repository name (docker official image); must convert to namespace/repository syntax
    esac
    authUrl="https://auth.docker.io/token?service=registry.docker.io&scope=repository:$item:pull"
    token="$(curl -fsSL "$authUrl" | jq --raw-output '.token')"
    tagsUrl="https://registry-1.docker.io/v2/$item/tags/list"
    curl -fsSL -H "Accept: application/json" -H "Authorization: Bearer $token" "$tagsUrl" | jq --raw-output '.tags[]'
}
docker_tags "$@"

Ejemplo:

$ docker_tags "alpine"
2.6
2.7
20190228
20190408
...
3
3.1
3.10
3.10.0
3.10.1
...
3.9.5
3.9.6
edge
latest

Es cierto que docker_tagshace varias suposiciones. Específicamente, los parámetros de solicitud de OAuth están en su mayoría codificados. Una implementación más ambiciosa haría una solicitud no autenticada al registro y derivaría los parámetros de OAuth a partir de la respuesta no autenticada.

RobV8R avatar Aug 19 '2018 21:08 RobV8R