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.



1
Otworzyłem bilet z prośbą o tę funkcję w docker(1) github.com/docker/for-linux/issues/455
— Winny

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”


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


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

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.


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.


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'

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



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]


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


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

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
}

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

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 


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>

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

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>

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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.