¿Cómo puedo enumerar todas las etiquetas de una imagen de Docker en un registro remoto?
¿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.
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=2
etc.
Para imágenes que no sean las imágenes oficiales de Docker, reemplácelas library
con el nombre del usuario/organización.
La URL https://hub.docker.com/v2/repositories/{namespace}/{repository}/tags
también funciona en este momento, sin embargo, en la especificación API no queda claro si es legal.
(Si lo ha jq
instalado, 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, dockertags
en /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'
A partir de Docker Registry V2, GET
basta 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í .
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"]'
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_tags
función.
La versión más reciente docker_tags
se 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_tags
hace 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.