tag run library imagenes hub example dockers container docker

run - download docker image



¿Cómo enumerar todas las etiquetas para una imagen Docker en un registro remoto? (17)

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

GET /v2/<name>/tags/list

Ver docs para más.

Me gustaría saber cómo enumerar todas las etiquetas de una imagen Docker en un registro remoto de Docker utilizando la CLI (preferida) o curl. Preferiblemente sin extraer todas las versiones del registro remoto, solo quiero enumerar las etiquetas.


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 }


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án todas las etiquetas para la imagen. p.ej. docker-browse tags library/alpine

docker-browse images enumerarán 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 Docker Registry HTTP API V2


Esta es una funcionalidad incorporada de Docker:

docker images gitlabregistry.domain.com/path/to-app

Resultados en

REPOSITORY TAG IMAGE ID CREATED SIZE gitlabregistry.domain.com/path/to-app 3.0.1 f60f49fba3e0 2 months ago 148MB ...


He hecho esto cuando tengo que implementar una tarea en la que si el usuario de alguna manera escribe la etiqueta incorrecta, entonces tenemos que dar la lista de todas las etiquetas presentes en el repositorio (repositorio de Docker) presente en el registro. Así que tengo código en secuencia de comandos 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 para el archivo por lotes como:

Dockerfile java version7


La API de Docker V2 requiere un token portador de OAuth con las notificaciones correspondientes. 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, les ofrezco la siguiente función docker-tags .

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

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

#!/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 OAuth de la respuesta no autenticada.



Me las arreglé para que funcione usando curl:

curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags

Tenga en cuenta que image_name no debe contener detalles del usuario, etc. Por ejemplo, si está presionando una imagen llamada tutum.co/username/x , image_name debería ser x .


Obtenga todas las etiquetas de Docker Hub: este comando utiliza el procesador JSON línea de comandos jq para seleccionar los nombres de etiqueta de JSON devueltos por el Registro de Docker Hub (las comillas se eliminan con tr ). Reemplace la 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"]''



Puede lograrlo 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

sudo apt-get install jq


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"]''


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



También puedes usar este scrap:

# vim /usr/sbin/docker-tags

& Añadir lo siguiente (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

Hazlo 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 esté al tanto de $ & # antes de ejecutar cualquier comando]


Tengo la respuesta de here . ¡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}''

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 crear un nuevo nombre de archivo, dockertags , en / usr / local / bin (o agregar un PATH env 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 php que contienen ''apache''


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'', =)