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

Preferiblemente sin extraer todas las versiones del registro remoto. Solo quiero enumerar las etiquetas.

302
Johan 4 feb. 2015 a las 14:22

19 respuestas

La mejor respuesta

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

Solo script de una línea: (encuentre 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}'

ACTUALIZAR 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 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 ---> lista todas las etiquetas de ubuntu

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

203
J Woodchuck 27 abr. 2018 a las 17:24

He hecho esto cuando tengo que implementar una tarea en la que si el usuario escribe de alguna manera la etiqueta incorrecta, entonces tenemos que dar la lista de todas las etiquetas presentes en el repositorio (repositorio de Docker) presente en el registro. Entonces tengo código en Script por lotes.

<html>
<pre style="background-color:#bcbbbb;">
@echo off

docker login --username=xxxx --password=xxxx
docker pull %1:%2

IF NOT %ERRORLEVEL%==0 (
echo "Specified Version is Not Found "
echo "Available Version for this image is :"
for /f %%i in (' curl -s -H "Content-Type:application/json" -X POST -d "{\"username\":\"user\",\"password\":\"password\"}" https://hub.docker.com/v2/users/login ^|jq -r .token ') do set TOKEN=%%i
curl -sH "Authorization: JWT %TOKEN%" "https://hub.docker.com/v2/repositories/%1/tags/" | jq .results[].name
)
</pre>
</html>

Entonces, en esto podemos dar argumentos a nuestro archivo por lotes como:

Dockerfile java version7 
0
Vatsal Garg 26 dic. 2018 a las 11:26

La API de Docker Registry tiene un punto final para enumerar todas las etiquetas .

Parece que Tutum tiene un punto final similar, así como una forma para acceder a través de tutum-cli.

Con el tutum-cli, intente lo siguiente:

tutum tag list <uuid>
1
030 6 jun. 2019 a las 21:13

Si la gente quiere leer las etiquetas del registro de Red Hat en {{X 0}}, los pasos son:

# example nodejs-12 image
IMAGE_STREAM=nodejs-12
REDHAT_REGISTRY_API="https://registry.redhat.io/v2/rhel8/$IMAGE_STREAM"
# Get an oAuth token based on a service account username and password https://access.redhat.com/articles/3560571
TOKEN=$(curl --silent -u "$REGISTRY_USER":"$REGISTRY_PASSWORD" "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull" |  jq --raw-output '.token')
# Grab the tags
wget -q --header="Accept: application/json" --header="Authorization: Bearer $TOKEN" -O - "$REDHAT_REGISTRY_API/tags/list" | jq -r '."tags"[]' 

Si desea comparar lo que tiene en su registro local de openshift con lo que está en el registro upstream.redhat.com, aquí hay un secuencia de comandos completa.

2
simbo1905 27 dic. 2019 a las 21:11

En powershell 5.1, tengo un script list_docker_image_tags.ps1 simple como este:

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $image
)

$url = "https://registry.hub.docker.com/v1/repositories/{0}/tags" -f $image 
Invoke-WebRequest $url  | ConvertFrom-Json | Write-Output

Entonces puedo grep para 4.7 etiquetas como esta:

./list_docker_image_tags.ps1 microsoft/dotnet-framework | ?{ $_.name -match "4.7" }
1
andreav 28 mar. 2020 a las 15:55

Aquí hay un script de Powershell que escribí para Windows. Maneja repositorios v1 y v2:

Get-DockerImageVersions.ps1:

param (
  [Parameter (Mandatory=$true)]$ImageName,
  [Parameter (Mandatory=$false)]$RegistryURL
)

if (!$RegistryURL) 
{
  $RegistryURL = "https://registry.hub.docker.com/v1/repositories"
}

$list = ""
if ($RegistryURL -like "*v2*") 
{
  $list = "/list"
}

$URL = "$RegistryURL/$ImageName/tags$list"

write-debug $URL
$resp = Invoke-WebRequest -UseBasicParsing $URL | ConvertFrom-Json

if ($RegistryURL -like "*v2*") 
{
  $tags = $resp | select tags
  $tags.tags
} else {
  $tags = $resp | select name
  $tags.name
}
2
Steve W 12 jul. 2018 a las 21:11

Obtener todas las etiquetas de Docker Hub: este comando usa el procesador de línea de comandos JSON {{X1 }} para seleccionar los nombres de las etiquetas del JSON devuelto por el Registro de Docker Hub (las comillas se eliminan con tr). Reemplace biblioteca con el nombre de usuario de Docker Hub, debian con el nombre de la imagen:

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'
2
Martyn Smith 13 abr. 2018 a las 02:15

También puede utilizar este mensaje para el bloc de notas:

# vim /usr/sbin/docker-tags 

& Adjuntar lo siguiente (tal como está):

#!/bin/bash
im="$1"
[[ -z "$im" ]] && { echo -e '\e[31m[-]\e[39m Where is the image name ??' ; exit ; }
[[ -z "$(echo "$im"| grep -o '/')" ]] && { link="https://hub.docker.com/r/library/$im/tags/" ; } || { link="https://hub.docker.com/r/$im/tags/" ; }
resp="$(curl -sL "$link")"
err="$(echo "$resp" | grep -o 'Page Not Found')"
if [[ ! -z "$err" ]] ; then
    echo -e "\e[31m[-]\e[39m No Image Found with name => [ \e[32m$im\e[39m ]"
    exit
else
    tags="$(echo "$resp"|sed  -e 's|}|\n|g' -e 's|{|\n|g'|grep '"result"'|sed -e 's|,|\n|g'|cut -d '[' -f2|cut -d ']' -f1|sed  '/"tags":/d'|sed -e 's|"||g')"
    echo -e "\e[32m$tags\e[39m"
fi

Hágalo ejecutable:

# chmod 755 /usr/sbin/docker-tags

Entonces finalmente intente por:

$ docker-tags testexampleidontexist
   [-] No Image Found with name => [ testexampleidontexist ]

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[Espero que conozca $ & # antes de ejecutar cualquier comando]

2
Mr. Pundir 7 abr. 2017 a las 09:29

Puede lograr ejecutando en la terminal esto:

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq . | grep name

Además, si no tiene jq, debe instalarlo por

sudo apt-get install jq
3
laynusfloyd 28 jun. 2019 a las 20:56

Para ver todas las etiquetas disponibles en un navegador:

https://registry.hub.docker.com/v1/repositories/<username>/<image_name>/tags

Es decir, https://hub.docker.com/r/localstack/localstack/tags

O puede obtener una respuesta json usando este punto final:

https://registry.hub.docker.com/v1/repositories/localstack/localstack/tags

3
thedanotto 5 jun. 2019 a las 17:13
curl -u <username>:<password> https://$your_registry/v2/$image_name/tags/list -s -o - | \
    tr -d '{' | tr -d '}' | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | \
    awk -F: '{print $3}' | sed -e 's/,/\n/g'

Puede usarlo si su env no tiene 'jq', =)

3
Nathan Tuggy 26 abr. 2017 a las 04:35

Puede enumerar todas las etiquetas con skopeo y jq para el análisis json a través de cli.

skopeo --override-os linux inspect docker://httpd | jq '.RepoTags'
[
  "2-alpine",
  "2.2-alpine",
  "2.2.29",
  "2.2.31-alpine",
  "2.2.31",
  "2.2.32-alpine",
  "2.2.32",
  "2.2.34-alpine",
  "2.2.34",
  "2.2",
  "2.4-alpine",
  "2.4.10",
  "2.4.12",
  "2.4.16",
  "2.4.17",
  "2.4.18",
  "2.4.20",
  "2.4.23-alpine",
  "2.4.23",
  "2.4.25-alpine",
  "2.4.25",
  "2.4.27-alpine",
  "2.4.27",
  "2.4.28-alpine",
  "2.4.28",
  "2.4.29-alpine",
  "2.4.29",
  "2.4.32-alpine",
  "2.4.32",
  "2.4.33-alpine",
  "2.4.33",
  "2.4.34-alpine",
  "2.4.34",
  "2.4.35-alpine",
  "2.4.35",
  "2.4.37-alpine",
  "2.4.37",
  "2.4.38-alpine",
  "2.4.38",
  "2.4.39-alpine",
  "2.4.39",
  "2.4.41-alpine",
  "2.4.41",
  "2.4.43-alpine",
  "2.4.43",
  "2.4",
  "2",
  "alpine",
  "latest"
]

Para registros externos:

skopeo --override-os linux inspect --creds username:password docker://<registry-url>/<repo>/<image> | jq '.RepoTags'

Nota: --override-os linux solo es necesario si no se está ejecutando en un host Linux. Por ejemplo, obtendrá mejores resultados si está en MacOS.

5
GabLeRoux 8 ago. 2020 a las 16:16

Consulte la utilidad CLI: https://www.npmjs.com/package/docker-browse

Permite la enumeración de etiquetas e imágenes.

docker-browse tags <image> enumerará todas las etiquetas de la imagen. p.ej. docker-browse tags library/alpine

docker-browse images enumerará todas las imágenes en el registro. Actualmente no está disponible para index.docker.io.

Puede conectarlo a cualquier registro, incluido el privado, siempre que sea compatible con el registro de Docker API HTTP V2

5
Alex Courtis 30 ago. 2017 a las 13:52

Sobre la base de la respuesta de Yan Foto (la v2 api), Creé una secuencia de comandos de Python simple para enumerar las etiquetas de una imagen determinada.

Uso:

./docker-registry-list.py alpine

Salida:

{
  "name": "library/alpine",
  "tags": [
    "2.6",
    "2.7",
    "3.1",
    "3.2",
    "3.3",
    "3.4",
    "3.5",
    "3.6",
    "3.7",
    "edge",
    "latest"
  ]
}
6
Alex Forbes 26 mar. 2018 a las 15:26

Si la herramienta de análisis JSON, jq está disponible

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'
14
sigjuice 29 may. 2020 a las 01:48

Me las arreglé para que funcione usando curl:

curl -u <username>:<password> https://myrepo.example/v1/repositories/<username>/<image_name>/tags

Tenga en cuenta que image_name no debe contener detalles del usuario, etc. Por ejemplo, si está enviando una imagen llamada myrepo.example/username/x, image_name debe ser x.

18
RobV8R 30 oct. 2020 a las 07:52

La API de Docker V2 requiere un token de portador de OAuth con las notificaciones adecuadas. 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 función docker-tags.

La versión más reciente de docker-tags se puede encontrar en mi GitHubGist: "Lista de etiquetas de imagen de Docker con bash".

La función docker-tags depende de jq. Si está jugando con JSON, es probable que ya lo tenga.

#!/usr/bin/env bash
docker-tags() {
    arr=("$@")

    for item in "${arr[@]}";
    do
        tokenUri="https://auth.docker.io/token"
        data=("service=registry.docker.io" "scope=repository:$item:pull")
        token="$(curl --silent --get --data-urlencode ${data[0]} --data-urlencode ${data[1]} $tokenUri | jq --raw-output '.token')"
        listUri="https://registry-1.docker.io/v2/$item/tags/list"
        authz="Authorization: Bearer $token"
        result="$(curl --silent --get -H "Accept: application/json" -H "Authorization: Bearer $token" $listUri | jq --raw-output '.')"
        echo $result
    done
}

Ejemplo

docker-tags "microsoft/nanoserver" "microsoft/dotnet" "library/mongo" "library/redis"

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 de la respuesta no autenticada.

21
RobV8R 19 ago. 2018 a las 21:38

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 grande page_size a la URL, p. Ej.

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'
27
0xCC 7 may. 2017 a las 10:08

A partir de Docker Registry V2, un simple GET es suficiente:

GET /v2/<name>/tags/list

Consulte documentos para obtener más información.

85
Yan Foto 14 sep. 2016 a las 08:12