Bagaimana saya bisa mendaftar semua tag untuk gambar Docker pada registri jarak jauh?

206

Bagaimana saya bisa mencantumkan semua tag gambar Docker pada registri Docker jarak jauh menggunakan CLI (lebih disukai) atau ikal?

Lebih disukai tanpa menarik semua versi dari registri jarak jauh. Saya hanya ingin mendaftar tag.

Johan
sumber

Jawaban:

177

Saya mendapat jawabannya dari sini . Terima kasih banyak! :)

Hanya skrip satu baris: (temukan semua tag 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}'

UPDATE Terima kasih atas saran @ degelf. Inilah skrip shellnya.

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

Anda bisa membuat nama file baru dockertags, di bawah / usr / local / bin (atau menambahkan PATH env ke .bashrc/ .zshrc) Anda, dan memasukkan kode itu ke dalamnya. Kemudian tambahkan izin yang dapat dieksekusi ( chmod +x dockertags).

Pemakaian:

dockertags ubuntu ---> daftarkan semua tag ubuntu

dockertags php apache ---> daftarkan semua tag php php yang berisi 'apache'

Vi.Ci
sumber
1
Anda dapat membungkus semuanya dalam echo [backtick] ...[backtick] untuk memadatkannya menjadi satu baris. Dan / atau ganti "debian" dengan $ 1 dan masukkan ke dalam skrip yang disebut "dockertags" di bawah / usr / local / bin. Lalu sebelum backtick penutup Anda dapat menambahkan | grep $ 2. Kemudian chmod + x, dan kemudian Anda bisa pergi "dockertags php apache" untuk melihat semua tag php yang mengandung apache.
dagelf
8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'jika Anda telah jqmenginstal
Tanner
1
Saya telah mengirim jawaban yang diperbarui untuk API V2 .
RobV8R
1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'jauh lebih bersih ditulistr -d '[]" '
William Pursell
1
Saya dimodifikasi untuk menggunakan argumen posisi kedua sebagai nama pengguna: kata sandi sehingga saya dapat mengganti wget untuk curl dan menggunakan userauth="-u ${2}"memungkinkan saya untuk ${userauth}(jika itu kosong, tidak ada u beralih atau params). Ini dapat membantu siapa saja yang menggunakan repo pribadi
MrMesees
79

Pada Docker Registry V2, GETcukuplah sederhana :

GET /v2/<name>/tags/list

Lihat dokumen untuk lebih lanjut.

Yan Foto
sumber
3
Berdasarkan info dalam sub-tag Tag di dokumen , GET ini tampaknya memerlukan otorisasi, sehingga API + v1 sedtampaknya benar-benar lebih mudah digunakan untuk pemeriksaan cepat ...
alias
3
Jika Anda mendapatkan kesalahan "tidak sah", lihat jawaban alternatif saya . Jangan menyinggung orang yang memposting jawaban asli. Saya harus mengambil langkah-langkah tambahan untuk mendapatkan jawaban di atas untuk bekerja dan ingin membantu orang lain.
RobV8R
23

Jika Anda ingin menggunakan API docker registry v2, ia mencantumkan tag berdasarkan halaman. Untuk daftar semua tag dari suatu gambar, Anda mungkin ingin menambahkan parameter page_size besar ke url, misalnya

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'
0xCC
sumber
2
Docker Hub tampaknya membatasi ukuran page_size hingga maksimum 100.
Shane
2
@Shane Oh benarkah? Saya belum menemukan gambar dengan banyak halaman. Apakah url suka https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101bekerja?
0xCC
2
yang javagambar adalah contoh yang baik. Ya, Anda dapat melakukan hal-hal seperti registry.hub.docker.com/v2/repository/library/java/tags/… . Lihat nextdan previouslink dalam hasil untuk contoh.
Shane
19

API Docker V2 membutuhkan token pembawa OAuth dengan klaim yang sesuai. Menurut pendapat saya, dokumentasi resmi agak kabur tentang topik tersebut. Agar orang lain tidak mengalami rasa sakit yang sama dengan yang saya alami, saya menawarkan docker-tagsfungsi di bawah ini .

Versi terbaru docker-tagsdapat ditemukan di GitHubGist saya : "Daftar Docker Image Tags using bash" .

Fungsi docker-tag memiliki ketergantungan pada jq . Jika Anda bermain dengan JSON, kemungkinan Anda sudah memilikinya.

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

Contoh

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

Memang, docker-tagsmembuat beberapa asumsi. Secara khusus, sebagian besar parameter permintaan OAuth dikodekan. Implementasi yang lebih ambisius akan membuat permintaan yang tidak diautentikasi ke registri dan mendapatkan parameter OAuth dari respons yang tidak diautentikasi.

RobV8R
sumber
3
Tidak perlu arr=("$@"). Tulis sajadocker-tags() { for item; do ....
William Pursell
Terima kasih untuk ini. Mendapatkan token itu membuatku gila.
FelicianoTech
17

Saya berhasil membuatnya bekerja menggunakan curl:

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

Catatan yang image_nameseharusnya tidak mengandung detail pengguna dll. Misalnya jika Anda mendorong gambar bernama tutum.co/username/xmaka image_nameseharusnya x.

Johan
sumber
1
Titik akhir v2 didokumentasikan di sini: docs.docker.com/registry/spec/api/#listing-image-tags
morloch
1
Apa situs web tutum.co ini yang menurut Anda harus saya beri mereka login dan kata sandi dockerhub saya?
Nakilon
1
@Nakilon Ketika saya menulis jawaban ini, beberapa tahun yang lalu, Tutum adalah layanan yang menyediakan Docker Registry pribadi. Dan saya tidak "memberi mereka" kata sandi saya, saya mengautentikasi dengan layanan mereka menggunakan otentikasi dasar HTTP standar melalui https.
Johan
Tutum tidak ada lagi. Dapatkah Anda memperbarui balasan Anda sehingga orang tidak sengaja mengirim kredensial mereka kepada siapa pun yang memiliki domain itu sekarang?
opyh
6

Jika alat parsing JSON, jqtersedia

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'
sigjuice
sumber
1
Gunakan kutipan untuk menghindari masalah dengan jq:'.[].name'
Soullivaneuh
1
@Soullivaneuh masalah apa yang mungkin terjadi tanpa tanda kutip? Terima kasih!
sigjuice
Dengan zsh, saya memiliki kesalahan berikut: no matches found: .[].name. Tapi itu bekerja dengan baik di bash, mungkin itu shell default Anda?
Soullivaneuh
@ Sloulivaneuh terima kasih! Saya telah menambahkan kutipan ke jqperintah
sigjuice
4

Lihat utilitas CLI: https://www.npmjs.com/package/docker-browse

Mengizinkan enumerasi tag dan gambar.

docker-browse tags <image>akan mencantumkan semua tag untuk gambar. misalnyadocker-browse tags library/alpine

docker-browse imagesakan mencantumkan semua gambar dalam registri. Saat ini tidak tersedia untuk index.docker.io.

Anda dapat menghubungkannya ke registri apa pun, termasuk yang pribadi, asalkan mendukung Docker Registry HTTP API V2

Alex Courtis
sumber
2

Anda juga dapat menggunakan memo ini:

# vim /usr/sbin/docker-tags 

& Tambahkan Mengikuti (sebagaimana adanya):

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

Jadikan Eksekusi:

# chmod 755 /usr/sbin/docker-tags

Kemudian Akhirnya Cobalah:

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

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[Semoga Anda mengetahui $ & # sebelum menjalankan perintah apa pun]

Pak Pundir
sumber
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'

Anda dapat menggunakannya jika env Anda tidak memiliki 'jq', =)

SwenChan
sumber
2

Dapatkan semua tag dari Docker Hub: perintah ini menggunakan JSONprosesor command-line jquntuk memilih nama tag dari yang JSONdikembalikan oleh Docker Hub Registry (tanda kutip dihapus dengan tr). Ganti perpustakaan dengan nama pengguna Docker Hub, debian dengan nama gambar:

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'
jamlee
sumber
2
Silakan pertimbangkan untuk menambahkan penjelasan kecil tentang mengapa ini menjawab pertanyaan, apa fungsinya, ...
β.εηοιτ.βε
2

Berikut ini skrip Powershell yang saya tulis untuk Windows. Menangani repo v1 dan 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
sumber
2

Anda dapat mencapai dengan menjalankan di terminal ini:

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

Juga, jika Anda tidak memiliki jq Anda harus menginstalnya

sudo apt-get install jq
laynusfloyd
sumber
curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name akan menghemat perintah grep
matson kepson
menggunakan versi 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo
1

Saya telah melakukan hal ini ketika saya harus mengimplementasikan tugas di mana jika pengguna entah bagaimana mengetik tag yang salah maka kita harus memberikan daftar semua tag yang ada di repo (Docker repo) yang ada dalam register. Jadi saya punya kode dalam 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>

Jadi dalam hal ini kita dapat memberikan argumen untuk keluar file batch seperti:

Dockerfile java version7 

Vatsal Garg
sumber
1

Docker Registry API memiliki titik akhir untuk mencantumkan semua tag .

Sepertinya Tutum memiliki titik akhir yang sama , serta cara mengakses melalui tutum-cli .

Dengan tutum-cli, coba yang berikut ini:

tutum tag list <uuid>
Alex
sumber
1
Saya tidak berpikir ini berfungsi untuk gambar registri. Saya hanya mendapatkan "Identifier '<id>' tidak cocok dengan layanan, node atau nodecluster".
Johan
1

Dalam powershell 5.1, saya memiliki skrip list_docker_image_tags.ps1 sederhana seperti ini:

[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

Maka saya dapat menerima 4,7 tag seperti ini:

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

Anda dapat mencantumkan semua tag dengan 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"
]

Untuk pendaftar eksternal:

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

Jika orang ingin membaca tag dari registri RedHat https://registry.redhat.io/v2maka langkah-langkahnya adalah:

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

Jika Anda ingin membandingkan apa yang Anda miliki di registri openshift lokal Anda dengan apa yang ada di registri up.redhat.com maka di sini adalah skrip lengkap .

simbo1905
sumber