Come posso elencare tutti i tag per un'immagine Docker su un registro remoto?


206

Come posso elencare tutti i tag di un'immagine Docker su un registro Docker remoto usando la CLI (preferita) o l'arricciatura?

Preferibilmente senza estrarre tutte le versioni dal registro remoto. Voglio solo elencare i tag.



1
Ho aperto un ticket per chiedere questa funzione in docker(1) github.com/docker/for-linux/issues/455
Winny

Risposte:


177

Ho ricevuto la risposta da qui . Molte grazie! :)

Solo uno script di una riga: (trova tutti i tag di 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}'

AGGIORNAMENTO Grazie per i consigli di @ degelf. Ecco lo script della 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}"

Puoi semplicemente creare un nuovo nome di file dockertags, sotto / usr / local / bin (o aggiungere un ENV PATH al tuo .bashrc/ .zshrc), e inserire quel codice in esso. Quindi aggiungere le autorizzazioni eseguibili ( chmod +x dockertags).

Uso:

dockertags ubuntu ---> elenca tutti i tag di ubuntu

dockertags php apache ---> elenca tutti i tag php php contenenti 'apache'


1
Puoi avvolgere il tutto in echo [backtick] ...[backtick] per condensarlo in una riga. E / o sostituisci "debian" con $ 1 e inseriscilo in uno script chiamato "dockertags" sotto / usr / local / bin. Quindi prima del backtick di chiusura puoi aggiungere | grep $ 2. Quindi chmod + x esso, e quindi puoi andare "dockertags php apache" per vedere tutti i tag php contenenti apache.
dagelf

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'se hai jqinstallato
Tanner


1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'è scritto molto più chiaramentetr -d '[]" '
William Pursell,

1
Ho modificato per utilizzare il secondo argomento posizionale come nome utente: password in modo da poter cambiare wget per curl e usare userauth="-u ${2}"permettendomi di farlo ${userauth}(se è vuoto non è possibile attivare o disattivare). Questo potrebbe aiutare chiunque utilizzi repository privati
MrMesees,

79

A partire dal Docker Registry V2, è GETsufficiente un semplice :

GET /v2/<name>/tags/list

Vedi i documenti per di più.


3
Sulla base delle informazioni nella sottosezione Tag nei documenti , questo GET sembra richiedere l'autorizzazione, quindi l'API v1 + sedsembra essere in realtà più semplice da usare per un controllo rapido ...
Akavel

3
Se ricevi un errore "non autorizzato", vedi la mia risposta alternativa . Senza offesa per la persona che ha pubblicato la risposta originale. Ho dovuto prendere ulteriori misure per ottenere la risposta sopra al lavoro e volevo aiutare gli altri.
RobV8R,

23

Se si desidera utilizzare l'API v2 del registro docker, elenca i tag per pagina. Per elencare tutti i tag di un'immagine, potresti voler aggiungere un parametro page_size grande all'URL, ad es

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'

2
Docker Hub sembra limitare page_size a un massimo effettivo di 100.
Shane

2
@Shane Oh davvero? Non ho trovato un'immagine con così tante pagine. Un URL piace https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101?
0xCC,

2
l' javaimmagine è un buon esempio. Sì, puoi fare cose come register.hub.docker.com/v2/repositories/library/java/tags/… . Vedere i collegamenti nexte previousnel risultato per esempi.
Shane,

19

L'API Docker V2 richiede un token bearer OAuth con le attestazioni appropriate. A mio avviso, la documentazione ufficiale è piuttosto vaga sull'argomento. In modo che gli altri non subiscano lo stesso dolore che ho fatto, offro la seguente docker-tagsfunzione.

La versione più recente di docker-tagspuò essere trovata nel mio GitHubGist: "Elenca i tag immagine Docker usando bash" .

La funzione docker -tags ha una dipendenza da jq . Se stai giocando con JSON, probabilmente lo hai già.

#!/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
}

Esempio

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

Certo, docker-tagsfa diverse ipotesi. In particolare, i parametri di richiesta OAuth sono per lo più codificati. Un'implementazione più ambiziosa farebbe una richiesta non autenticata al registro e trarrebbe i parametri OAuth dalla risposta non autenticata.


3
Non ce n'è bisogno arr=("$@"). Basta scriveredocker-tags() { for item; do ....
William Pursell il

Grazie per questo. Ottenere quel token mi stava facendo impazzire.
Feliciano

17

Sono riuscito a farlo funzionare usando curl:

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

Si noti che image_namenon deve contenere i dettagli dell'utente, ecc Per esempio, se si sta spingendo immagine di nome tutum.co/username/xallora image_namedovrebbe essere x.



1
Cos'è questo sito tutum.co che dici che dovrei dare loro il mio login e password dockerhub?
Nakilon,

1
@Nakilon Quando ho scritto questa risposta, diversi anni fa, Tutum era un servizio che forniva un registro Docker privato. E non sto "dando loro" la mia password, autentico con il loro servizio usando l'autenticazione di base HTTP standard su https.
Johan

Tutum non esiste più. Puoi aggiornare la tua risposta in modo che le persone non invhino accidentalmente le proprie credenziali a chiunque possieda quel dominio adesso?
Opyh


6

Se lo strumento di analisi JSON jqè disponibile

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'

1
Usa le virgolette per evitare problemi con jq:'.[].name'
Soullivaneuh

1
@Soullivaneuh quali problemi potrebbero verificarsi senza virgolette? Grazie!
sigjuice,

Con zsh, ho il seguente errore: no matches found: .[].name. Ma funziona bene su bash, forse è la tua shell predefinita?
Soullivaneuh,

@Soullivaneuh grazie! Ho aggiunto citazioni al jqcomando
sigjuice

4

Vedi l'utilità CLI: https://www.npmjs.com/package/docker-browse

Consente l'enumerazione di tag e immagini.

docker-browse tags <image>elencherà tutti i tag per l'immagine. per esempiodocker-browse tags library/alpine

docker-browse imageselencherà tutte le immagini nel registro. Al momento non disponibile per index.docker.io.

È possibile collegarlo a qualsiasi registro, incluso quello privato, purché supporti l' API HTTP V2 del registro Docker



2

Puoi anche usare questo scrap:

# vim /usr/sbin/docker-tags 

E aggiungi quanto segue (così com'è):

#!/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

Renderlo eseguibile:

# chmod 755 /usr/sbin/docker-tags

Quindi, infine, prova da:

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

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[Spero che tu sia a conoscenza di $ & # prima di eseguire qualsiasi comando]


2
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'

Puoi usarlo se il tuo env non ha 'jq', =)


2

Ricevi tutti i tag da Docker Hub: questo comando utilizza il JSONprocessore della riga di comando jqper selezionare i nomi dei tag da quelli JSONrestituiti dal registro Docker Hub (le virgolette vengono rimosse con tr). Sostituisci la libreria con il nome utente Docker Hub, debian con il nome dell'immagine:

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'

2
Ti preghiamo di considerare di aggiungere una piccola spiegazione del perché questa risposta alla domanda, cosa fa, ...
β.εηοιτ.βε

2

Ecco uno script Powershell che ho scritto per Windows. Gestisce i repository v1 e 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

Puoi farlo eseguendo sul terminale questo:

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

Inoltre, se non hai jq, devi installarlo

sudo apt-get install jq

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name ti salverà un comando grep
matson kepson il

usando la versione 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo il

1

Ho fatto questa cosa quando devo implementare un'attività in cui se l'utente digita in qualche modo il tag sbagliato, allora dobbiamo dare l'elenco di tutti i tag presenti nel repository (Docker repo) presente nel registro. Quindi ho il codice in batch Script.

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

Quindi in questo possiamo fornire argomenti per estrarre file batch come:

Dockerfile java versione7 


1

L'API del registro Docker ha un endpoint per elencare tutti i tag .

Sembra che Tutum abbia un endpoint simile , oltre a un modo per accedere tramite tutum-cli .

Con tutum-cli, prova quanto segue:

tutum tag list <uuid>

1
Non penso che questo funzioni per le immagini del registro. Ho appena ricevuto un "Identificatore" <id> "che non corrisponde a nessun servizio, nodo o nodecluster".
Johan,

1

In PowerShell 5.1, ho un semplice script list_docker_image_tags.ps1 come questo:

[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

Quindi posso grep per i tag 4.7 in questo modo:

./list_docker_image_tags.ps1 microsoft/dotnet-framework | ?{ $_.name -match "4.7" }

1

Puoi elencare tutti i tag con skopeo .

அ  ~  skopeo 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"
]

Per i registri esterni:

அ  ~  skopeo inspect --creds username:password docker://<registry-url>/<repo>/<image>

0

Se la gente vuole leggere i tag dal registro RedHat in https://registry.redhat.io/v2quel momento i passaggi sono:

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

Se vuoi confrontare ciò che hai nel tuo registro di openshift locale con quello che c'è nel registro di upstream.redhat.com allora ecco uno script completo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.