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.