Docker görüntüsü için tüm etiketleri uzak kayıt defterinde nasıl listeleyebilirim?


207

Bir Docker görüntüsünün tüm etiketlerini CLI (tercih edilen) veya curl kullanarak uzak bir Docker kayıt defterinde nasıl listeleyebilirim?

Tercihen uzak kayıt defterinden tüm sürümleri çekmeden. Sadece etiketleri listelemek istiyorum.



1
Bu özelliği soran bir bilet açtım docker(1) github.com/docker/for-linux/issues/455
Winny

Yanıtlar:


178

Cevabı buradan aldım . Çok teşekkürler! :)

Sadece bir satırlık komut dosyası: (debian'in tüm etiketlerini bulun)

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

GÜNCELLEME @ degelf'nin tavsiyesi için teşekkürler. İşte kabuk betiği.

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

dockertags/ Usr / local / bin altında yeni bir dosya adı oluşturabilir (veya .bashrc/ dizininize PATH env'si ekleyebilir .zshrc) ve bu kodu içine koyabilirsiniz. Ardından yürütülebilir izinleri ( chmod +x dockertags) ekleyin .

Kullanımı:

dockertags ubuntu ---> tüm ubuntu etiketlerini listele

dockertags php apache ---> 'apache' içeren tüm php etiketlerini listele


1
Her şeyi ...bir satırda yoğunlaştırmak için echo [backtick] [backtick] içine sarabilirsiniz . Ve / veya "debian" yerine 1 $ yazın ve / usr / local / bin altındaki "dockertags" adlı bir komut dosyasına koyun. Sonra kapanış backtick önce | grep $ 2 ekleyebilirsiniz. Sonra chmod + x ve sonra apache içeren tüm php etiketlerini görmek için "dockertags php apache" ye gidebilirsiniz.
dagelf

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'Eğer varsa jqkurulu
Tanner


1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'çok daha temiz yazılmıştr -d '[]" '
William Pursell

1
İkinci konum bağımsız değişkenini kullaniciadi: password olarak kullanacak şekilde değiştirdim, böylece kıvırmak için wget'i kapatabilir ve userauth="-u ${2}"bana izin verebilirim ${userauth}(boşsa u geçiş veya param yoksa). Bu, özel
repo'ları

81

Docker Registry V2'den itibaren basit bir GETyeterlilik:

GET /v2/<name>/tags/list

Daha fazla bilgi için dokümanlara bakın .


3
Dokümanlardaki Etiketler alt bölümündeki bilgilere dayanarak , bu GET için yetkilendirme gerekiyor gibi görünüyor, bu nedenle v1 API + 'nın sedhızlı bir kontrol için kullanımı gerçekten daha basit görünüyor ...
akavel

3
"Yetkisiz" hatası alıyorsanız alternatif cevabıma bakın . Orijinal yanıtı yayınlayan kişiye hiçbir suç. Yukarıdaki cevabı almak için ek adımlar atmam gerekiyordu ve başkalarına yardım etmek istedim.
RobV8R

23

Docker kayıt defteri v2 API'sını kullanmak istiyorsanız, etiketleri sayfalara göre listeler. Bir görüntünün tüm etiketlerini listelemek için, URL'ye büyük bir page_size parametresi eklemek isteyebilirsiniz, ör.

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

2
Docker Hub'ın page_size değerini etkili bir maksimum 100 ile sınırladığı görülüyor.
Shane

2
@ Gerçekten mi? Bu kadar sayfalı bir resim ile karşılaşmadım. Bir url https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101çalışıyor mu?
0xCC

2
javagörüntü iyi bir örnektir. Evet, register.hub.docker.com/v2/repositories/library/java/tags/… gibi şeyler yapabilirsiniz . Örnekler için sonuçtaki nextve previousbağlantılarına bakın .
Shane

19

Docker V2 API, uygun hak talepleriyle OAuth taşıyıcı jetonu gerektirir. Bence, resmi belgeler bu konuda oldukça belirsiz. Diğerleri benim yaptığım aynı acıdan geçmemek için, aşağıdaki docker-tagsfonksiyonu sunuyoruz .

En son sürümü docker-tagsbenim bulunabilir GitHubGist: "bash kullanarak Liste Docker Görüntü Etiketler" .

Docker-tags işlevi jq'ye bağımlıdır . JSON ile oynuyorsanız, muhtemelen zaten var.

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

Misal

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

Kuşkusuz, docker-tagsbirkaç varsayım yapar. Özellikle, OAuth istek parametreleri çoğunlukla sabit kodlanır. Daha iddialı bir uygulama, kayıt defterine kimliği doğrulanmamış bir istekte bulunur ve OAuth parametrelerini kimliği doğrulanmamış yanıttan türetir.


3
Gerek yok arr=("$@"). Sadece yazdocker-tags() { for item; do ....
William Pursell

Bunun için teşekkür ederim. Bu jetonu almak beni deli ediyordu.
FelicianoTech

18

Curl kullanarak çalışmayı başardım:

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

Not image_nameadlandırılmış görüntüyü itiyorsun Örneğin vb kullanıcı bilgilerini içermemelidir tutum.co/username/xsonra image_nameolmalıdır x.



1
Onlara dockerhub kullanıcı adı ve şifremi vermem gerektiğini söylediğiniz bu tutum.co web sitesi nedir?
Nakilon

1
@Nakilon Birkaç yıl önce bu cevabı yazdığımda, Tutum özel bir Docker Registry sağlayan bir hizmetti. Ve şifremi "onlara vermiyorum", https üzerinden standart HTTP temel kimlik doğrulamasını kullanarak hizmetleriyle kimlik doğrulaması yapıyorum.
Johan

Tutum artık mevcut değil. Yanıtınızı, kullanıcıların şu anda bu alan adının sahibi olan kişilere kimlik bilgilerini yanlışlıkla göndermemesi için güncelleyebilir misiniz?
opyh


6

JSON ayrıştırma aracı jqmevcutsa

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

1
Jq ile ilgili sorunu önlemek için tırnak işaretleri kullanın:'.[].name'
Soullivaneuh

1
@Soullivaneuh tırnak işaretleri olmadan ne gibi sorunlar yaşanabilir? Teşekkürler!
sigjuice

Zsh ile, aşağıdaki hata var: no matches found: .[].name. Ama bash'da iyi çalışıyor, belki varsayılan kabuğunuz?
Soullivaneuh

@Soullivaneuh teşekkürler! jqKomuta alıntılar ekledim
sigjuice

4

CLI yardımcı programına bakın: https://www.npmjs.com/package/docker-browse

Etiket ve görüntülerin numaralandırılmasına izin verir.

docker-browse tags <image>resim için tüm etiketleri listeler. Örneğindocker-browse tags library/alpine

docker-browse imageskayıt defterindeki tüm resimleri listeler. Şu anda için mevcut değil index.docker.io.

Docker Registry HTTP API V2'yi desteklediği sürece özel kayıt da dahil olmak üzere herhangi bir kayıt defterine bağlayabilirsiniz.



2

Bu notu da kullanabilirsiniz:

# vim /usr/sbin/docker-tags 

& Aşağıdaki gibi ekleyin (olduğu gibi):

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

Yürütülebilir Yapın:

# chmod 755 /usr/sbin/docker-tags

Sonra Sonunda Deneyin:

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

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[ Herhangi bir komut çalıştırmadan önce $ & # 'ın farkında olduğunuzu umuyoruz ]


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'

Env'nizde 'jq' yoksa =) kullanabilirsiniz


2

Docker Hub'dan tüm etiketleri alın: Bu komut , Docker Hub Kayıt Defteri tarafından döndürülen etiket adlarını seçmek için komut satırı JSONişlemcisini kullanır (tırnak işaretleri ile kaldırılır ). Değiştir kütüphane , Docker Hub kullanıcı adıyla debian görüntü adıyla:jqJSONtr

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

2
Lütfen bunun neden soruya cevap verdiğine, ne işe yaradığına dair küçük bir açıklama eklemeyi düşünün ...
β.εηοιτ.βε

2

İşte Windows için yazdığım bir Powershell betiği. V1 ve v2 depolarını işler:

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

Terminalde çalışarak bunu başarabilirsiniz:

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

Ayrıca, jq'niz yoksa yüklemeniz gerekir.

sudo apt-get install jq

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name size bir grep komutu kurtaracak
matson kepson

sürüm 1 kullanarak:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo

1

Ben kullanıcı bir şekilde yanlış etiketi yazın, o zaman biz kayıtta mevcut repo (Docker repo) mevcut tüm etiket listesini vermek zorunda olduğu bir görev uygulamak zorunda olduğunda bu şey yaptım. Bu yüzden toplu Script kod var.

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

Yani bu şekilde toplu iş dosyasına argümanlar verebiliriz:

Dockerfile java sürüm7 


1

Docker Kayıt Defteri API'sının tüm etiketleri listelemek için bir uç noktası vardır .

Tutum'un benzer bir uç noktası olduğu gibi tutum-cli ile erişmenin bir yolu var gibi görünüyor .

Tutum-cli ile aşağıdakileri deneyin:

tutum tag list <uuid>

1
Bunun kayıt defteri görüntüleri için işe yaradığını sanmıyorum. Ben sadece bir "Tanımlayıcı '<id>' herhangi bir hizmet, düğüm veya nodecluster ile eşleşmiyor" olsun.
Johan

1

Millet etiketleri RedHat kayıt defterinden şu anda okumak istiyorsa https://registry.redhat.io/v2, adımlar şunlardır:

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

Yerel openshift kayıt defterinizde bulunanları yukarı doğru kayıt defteri.redhat.com'da bulunanlarla karşılaştırmak istiyorsanız, burada tam bir komut dosyasıdır .


1

Powershell 5.1, böyle basit bir list_docker_image_tags.ps1 komut dosyası var:

[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

Sonra böyle 4.7 etiketleri için grep olabilir:

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

1

Tüm etiketleri skopeo ile listeleyebilirsiniz .

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

Harici kayıtlar için:

அ  ~  skopeo inspect --creds username:password docker://<registry-url>/<repo>/<image>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.