Jak wyświetlić wszystkie tagi obrazu Docker w zdalnym rejestrze?

206

Jak mogę wyświetlić wszystkie tagi obrazu Docker w zdalnym rejestrze Docker przy użyciu CLI (preferowane) lub curl?

Najlepiej bez pobierania wszystkich wersji ze zdalnego rejestru. Chcę tylko wymienić tagi.

Johan
źródło

Odpowiedzi:

177

Mam stąd odpowiedź . Wielkie dzięki! :)

Tylko skrypt wiersza: (znajdź wszystkie tagi 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}'

AKTUALIZACJA Dziękujemy za radę @ degelf. Oto skrypt powłoki.

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

Możesz po prostu utworzyć nową nazwę pliku dockertags, w / usr / local / bin (lub dodać env ŚCIEŻKI do .bashrc/ .zshrc) i umieścić w nim ten kod. Następnie dodaj uprawnienia do plików wykonywalnych ( chmod +x dockertags).

Stosowanie:

dockertags ubuntu ---> wyświetl wszystkie tagi ubuntu

dockertags php apache ---> wyświetl wszystkie tagi php php zawierające „apache”

Vi.Ci
źródło
1
Możesz zawinąć całość w echo [lewy] ...[lewy], aby skondensować go w jedną linię. I / lub zamień „debian” na 1 $ i umieść go w skrypcie o nazwie „dockertags” w katalogu / usr / local / bin. Następnie przed zamykającym strzałem wstecznym możesz dodać | grep 2 $. Następnie chmod + x it, a następnie możesz przejść do „dockertags php apache”, aby zobaczyć wszystkie tagi php zawierające apache.
dagelf
8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'jeśli masz jqzainstalowany
Tanner
1
Opublikowałem zaktualizowaną odpowiedź na API V2 .
RobV8R
1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'jest o wiele bardziej czysto napisanetr -d '[]" '
William Pursell
1
Zmodyfikowałem, aby użyć drugiego argumentu pozycyjnego jako nazwy użytkownika: hasła, abym mógł zmienić wget na curl i użyć userauth="-u ${2}"pozwalając mi na to ${userauth}(jeśli jest puste, nie przełącza się ani nie paruje). To może pomóc każdemu, kto korzysta z prywatnych repozytoriów
MrMesees
79

Począwszy od Docker Registry V2 GETwystarczy:

GET /v2/<name>/tags/list

Widzieć dokumentację, aby uzyskać więcej.

Yan Foto
źródło
3
W oparciu o informacje w podsekcji Tagi w dokumentacji , ten GET wydaje się wymagać autoryzacji, więc interfejs API + v1 sedwydaje się być w rzeczywistości łatwiejszy do szybkiego sprawdzenia ...
akavel
3
Jeśli pojawia się błąd „nieautoryzowany”, zobacz moją alternatywną odpowiedź . Bez obrazy osoby, która opublikowała oryginalną odpowiedź. Musiałem podjąć dodatkowe kroki, aby powyższa odpowiedź zadziałała, i chciałem pomóc innym.
RobV8R,
23

Jeśli chcesz użyć interfejsu API rejestru dokera v2, wyświetla tagi według stron. Aby wyświetlić listę wszystkich tagów obrazu, możesz dodać duży parametr page_size do adresu URL, np

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'
0xCC
źródło
2
Docker Hub wydaje się ograniczać rozmiar strony do efektywnego maksimum 100.
Shane
2
@Shane Oh naprawdę? Nie spotkałem obrazu z tyloma stronami. Czy adres URL https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101działa?
0xCC 17.07.17
2
javaobraz jest dobrym przykładem. Tak, możesz robić takie rzeczy, jak register.hub.docker.com/v2/repositories/library/java/tags/… . Patrz nexti previousłączy w wyniku za przykłady.
Shane,
19

Interfejs API Docker V2 wymaga tokenu nośnika OAuth z odpowiednimi roszczeniami. Moim zdaniem oficjalna dokumentacja na ten temat jest dość niejasna. Aby inni nie cierpieli z powodu tego samego bólu, co ja, oferuję poniżejdocker-tags funkcję.

Najnowszą wersję docker-tagsmożna znaleźć w mojej GitHubGist: „Lista znaczników obrazu Docker za pomocą bash” .

Funkcja znaczników dokujących ma zależność od jq . Jeśli grasz z JSON, prawdopodobnie już go masz.

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

Przykład

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

Wprawdzie docker-tagsprzyjmuje kilka założeń. W szczególności parametry żądania OAuth są w większości zakodowane na stałe. Bardziej ambitna implementacja spowodowałaby nieuwierzytelnione żądanie do rejestru i wyprowadziłaby parametry OAuth z nieuwierzytelnionej odpowiedzi.

RobV8R
źródło
3
Nie ma takiej potrzeby arr=("$@"). Po prostu napiszdocker-tags() { for item; do ....
William Pursell
Dziękuję Ci za to. Zdobycie tego tokena doprowadzało mnie do szału.
FelicianoTech,
17

Udało mi się uruchomić to za pomocą curl:

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

Należy pamiętać, że image_namenie powinno zawierać dane użytkownika itd. Na przykład, jeśli jesteś pchanie obraz nazwany tutum.co/username/xpotem image_namepowinno być x.

Johan
źródło
1
Punkt końcowy v2 jest udokumentowany tutaj: docs.docker.com/registry/spec/api/#listing-image-tags
morloch,
1
Jaka jest ta strona tutum.co, którą, jak mówisz, powinienem podać login i hasło do dockerhub?
Nakilon,
1
@Nakilon Kiedy napisałem tę odpowiedź kilka lat temu, Tutum był usługą, która zapewniała prywatny rejestr dokerów. I nie „daję im” mojego hasła, uwierzytelniam się za pomocą ich usługi przy użyciu standardowego podstawowego uwierzytelniania HTTP przez https.
Johan
Tutum już nie istnieje. Czy możesz zaktualizować swoją odpowiedź, aby ludzie nie wysyłali przypadkowo swoich danych uwierzytelniających do osoby, która jest teraz właścicielem tej domeny?
opyh
6

Jeśli narzędzie analizujące JSON jqjest dostępne

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'
sigjuice
źródło
1
Użyj cudzysłowu, aby uniknąć problemu z jq:'.[].name'
Soullivaneuh
1
@Soullivaneuh jakie problemy mogą się zdarzyć bez cytatów? Dzięki!
podpisywanie
Z zsh, mam następujący błąd: no matches found: .[].name. Ale działa dobrze na bash, może to twoja domyślna powłoka?
Soullivaneuh
@Soullivaneuh dzięki! Do jqpolecenia dodałem cytaty
podpis
4

Zobacz narzędzie CLI: https://www.npmjs.com/package/docker-browse

Umożliwia wyliczenie znaczników i obrazów.

docker-browse tags <image>wyświetli listę wszystkich tagów obrazu. na przykładdocker-browse tags library/alpine

docker-browse imageswyświetli wszystkie obrazy w rejestrze. Obecnie niedostępne dlaindex.docker.io .

Możesz podłączyć go do dowolnego rejestru, w tym prywatnego, pod warunkiem, że obsługuje on Docker Registry HTTP API V2

Alex Courtis
źródło
2

Możesz także użyć tego złomu:

# vim /usr/sbin/docker-tags 

& Dołącz następujące (jak to jest):

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

Zrób to:

# chmod 755 /usr/sbin/docker-tags

Następnie w końcu spróbuj:

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

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[Mam nadzieję, że znasz $ i # przed uruchomieniem jakiegokolwiek polecenia]

Pan Pundir
źródło
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'

Możesz go użyć, jeśli twoja env nie ma „jq”, =)

SwenChan
źródło
2

Pobierz wszystkie tagi z Docker Hub: to polecenie używa JSONprocesora wiersza polecenia jqdo wybrania nazw znaczników z JSONrejestru Docker Hub (cudzysłowy są usuwane za pomocą tr). Zamień bibliotekę na nazwę użytkownika Docker Hub, debian na nazwę obrazu:

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'
jamlee
źródło
2
Proszę rozważyć dodanie
krótkiego
2

Oto skrypt Powershell, który napisałem dla systemu Windows. Obsługuje repozytorium v1 i 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
}
Steve W.
źródło
2

Możesz to osiągnąć, uruchamiając na terminalu:

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

Ponadto, jeśli nie masz jq, musisz go zainstalować

sudo apt-get install jq
laynusfloyd
źródło
curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name uratuje ci polecenie grep
matson kepson
przy użyciu wersji 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo
1

Zrobiłem to, gdy muszę zaimplementować zadanie, w którym jeśli użytkownik w jakiś sposób wpisze niewłaściwy znacznik, wówczas musimy podać listę wszystkich znaczników obecnych w repozytorium (repozytorium Docker) obecnych w rejestrze. Więc mam kod w skrypcie wsadowym.

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

W ten sposób możemy podać argumenty do pliku wsadowego, takiego jak:

Dockerfile java version7 

Vatsal Garg
źródło
1

Interfejs API rejestru Docker ma punkt końcowy do wyświetlania wszystkich tagów .

Wygląda na to, że Tutum ma podobny punkt końcowy , a także sposób dostępu za pośrednictwem tutum-cli .

Korzystając z tutum-cli, spróbuj wykonać następujące czynności:

tutum tag list <uuid>
Alex
źródło
1
Nie sądzę, że to działa w przypadku obrazów rejestru. Po prostu dostaję, że „Identyfikator” <id> ”nie pasuje do żadnej usługi, węzła ani klastra węzłów”.
Johan
1

W PowerShell 5.1 mam prosty skrypt list_docker_image_tags.ps1, taki jak ten:

[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

Następnie mogę grep dla takich tagów 4.7:

./list_docker_image_tags.ps1 microsoft/dotnet-framework | ?{ $_.name -match "4.7" }
andreav
źródło
1

Możesz wyświetlić wszystkie tagi za pomocą 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"
]

W przypadku rejestrów zewnętrznych:

அ  ~  skopeo inspect --creds username:password docker://<registry-url>/<repo>/<image>
Buvanesh Kumar
źródło
0

Jeśli ludzie chcą czytać tagi z rejestru RedHat, https://registry.redhat.io/v2wówczas są następujące kroki:

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

Jeśli chcesz porównać to, co masz w lokalnym rejestrze openshift z tym, co znajduje się w rejestrze upstream.redhat.com, to jest to kompletny skrypt .

simbo1905
źródło