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.
La API de registro de Docker tiene un punto final para enumerar todas las etiquetas .
Parece que Tutum tiene un punto final similar , así como una forma de acceder a través de tutum-cli .
Con el tutum-cli, intente lo siguiente:
tutum tag list <uuid>
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"]''
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 bien, puede obtener una respuesta json utilizando este punto final:
https://registry.hub.docker.com/v1/repositories/localstack/localstack/tags
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
Sobre la base de la respuesta de Yan Foto (la docs ), creé un script simple de Python 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"
]
}
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'', =)