Cara mendapatkan daftar gambar pada docker registry v2

204

Saya menggunakan docker registry v1 dan saya tertarik untuk bermigrasi ke versi yang lebih baru, v2. Tapi saya perlu beberapa cara untuk mendapatkan daftar gambar yang ada di registri; misalnya dengan registry v1 saya dapat menjalankan permintaan GET http://myregistry:5000/v1/search?dan hasilnya adalah:

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}

Tapi saya tidak dapat menemukan sesuatu yang mirip di dokumentasi resmi untuk mendapatkan daftar gambar pada registri. Adakah yang tahu cara melakukannya di versi baru v2?

kikicarbonell
sumber
Masih kurang. Perlu tanggal pembuatan gambar dan dorongan gambar, dan mudah-mudahan menyertakan / menekan versi tag sebelumnya. Harus ada antarmuka web yang sebenarnya juga, bukan? Saya sedang berbicara dengan admin kami - kami hanya punya 2.0
Andrew Wolfe

Jawaban:

405

Untuk versi Registry V2 terbaru (per 2015-07-31), Anda bisa mendapatkan gambar ini dari DockerHub:

docker pull distribution/registry:master

Daftar semua repositori (gambar yang efektif):

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

Daftar semua tag untuk repositori:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
jonatan
sumber
3
Dari mana Anda mendapatkan sertifikat?
dualitas_
3
@kualitas dalam hal registri Anda menggunakan sertifikat yang ditandatangani sendiri, atau sertifikat yang ditandatangani oleh root CA yang tidak tepercaya, Anda perlu menyediakan sertifikat untuk meringkuk untuk membuat koneksi yang aman. Untuk membuat koneksi yang tidak aman, Anda dapat menambahkan flag '--insecure'.
Jonatan
5
-k, --insecure (SSL)
Ilja
9
Hasil default hanya menampilkan 100 gambar yang direkam, tetapi jika Anda perlu menampilkan lebih banyak, Anda dapat memberi paginasi pada hasil dengan permintaan ini: http://<registry-url>/v2/_catalog?n=<count>dengan hitung misalnya 2000.
kikicarbonell
17
Jika registri dilindungi kata sandi, gunakancurl -u <user>:<pass> -X GET ...
nsantos
77

Anda dapat mencari di

http: // <ip/hostname>: <port>/ v2 / _catalog

Abhishek Jaiswal
sumber
4
... baru-baru ini saya hanya ingin menambahkan bahwa https diperlukan, bukan hanya http
Nikola
2
Saya melihat tidak ada kebutuhan untuk Docker Registry saya yang baru diinstal!
Enok82
44

Dapatkan katalog

Default, registry api mengembalikan 100 entri katalog, ada kode :

Ketika Anda meringkuk api registri:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

itu setara dengan:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

Ini adalah metod pagination.

Ketika jumlah entri melebihi 100, Anda dapat melakukannya dengan dua cara:

Pertama : berikan angka yang lebih besar

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

Sencond : uraikan url tautan berikutnya

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

Elemen tautan yang terkandung dalam tajuk respons:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

header respons:

Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

Elemen tautan memiliki entri terakhir dari permintaan ini, maka Anda dapat meminta 'halaman' berikutnya:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

Jika tajuk respons berisi elemen tautan , Anda dapat melakukannya dalam satu lingkaran .

Dapatkan Gambar

Ketika Anda mendapatkan hasil katalog, itu seperti berikut:

{ "repositories": [ "busybox", "ceph/mds" ] }

Anda bisa mendapatkan gambar di setiap katalog:

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

pengembalian:

{"name":"busybox","tags":["latest"]}

litanhua
sumber
1
100 entri didefinisikan di sini
litanhua
2
Ini harus menjadi jawaban yang diterima. Ini adalah satu-satunya jawaban yang menjelaskan bagaimana Anda menyiasati pagination yang ditakuti. Jawaban yang diterima saat ini (jonatan) hanya menampilkan gambar yang dimulai dengan "a".
user2394284
dan bagaimana Anda mendapatkan daftar tag ceph/mds? secara umum, untuk repositori apa pun yang didefinisikan dengan /- /v2/_catalog/ceph/mdt/tags/listtidak berfungsi
tymik
25

Versi terbaru dari Docker Registry tersedia dari https://github.com/docker/distribution mendukung API Katalog. (v2 / _catalog). Ini memungkinkan kemampuan untuk mencari repositori

Jika tertarik, Anda dapat mencoba registry image docker CLI yang saya buat untuk memudahkan penggunaan fitur pencarian dalam distribusi Docker Registry yang baru ( https://github.com/vivekjuneja/docker_registry_cli )

ZephyrPLUSPLUS
sumber
21

Kami menulis alat CLI untuk tujuan ini: docker-ls Ini memungkinkan Anda untuk menelusuri register buruh pelabuhan dan mendukung otentikasi melalui token atau auth dasar.

Christian Speckner
sumber
21

Ini membuatku gila, tapi akhirnya aku menyatukan semuanya. Pada 1/25/2015, saya telah mengkonfirmasi bahwa adalah mungkin untuk membuat daftar gambar dalam register docker V2 (persis seperti @jonatan yang disebutkan di atas.)

Saya akan memilih jawaban itu, jika saya punya perwakilan untuk itu.

Sebaliknya, saya akan memperluas jawabannya. Karena registri V2 dibuat dengan mempertimbangkan keamanan, saya pikir pantas untuk memasukkan cara mengaturnya dengan sertifikat yang ditandatangani sendiri , dan menjalankan wadah dengan sertifikat tersebut agar panggilan https dapat dilakukan dengan sertifikat itu:

Ini skrip yang sebenarnya saya gunakan untuk memulai registri:

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

Ini mungkin jelas bagi sebagian orang, tetapi saya selalu bingung dengan kunci dan sertifikat. File yang perlu direferensikan untuk membuat panggilan @jonaton menyebutkan di atas **, adalah domain.crt yang tercantum di atas. (Karena saya memasukkan domain.crt /root, saya membuat salinan ke direktori pengguna tempat itu bisa diakses.)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

** Perintah di atas telah diubah: -X GET tidak benar-benar berfungsi ketika saya mencobanya.

Catatan: https://myregistry:5000(seperti di atas) harus cocok dengan domain yang diberikan ke sertifikat yang dibuat.

Cognitiaclaeves
sumber
7

Ini adalah liner kecil yang bagus (menggunakan JQ) untuk mencetak daftar Repos dan tag terkait.

Jika Anda belum jqmenginstal, Anda dapat menggunakan:brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list
Astaga
sumber
argh, saya baru saja menulis ini lalu menemukan milik Anda: S tetapi saya akan menjaga jawaban saya karena itu menunjukkan bagaimana menangani auth Dasar juga, dan itu menjelaskan mengapa ia bekerja. Saring juga hasilnya ke daftar gambar datar.
Craig Ringer
Hanya untuk berjaga-jaga jika jq tidak ada di distro Linux Anda, dapatkan itu stedolan.github.io/jq/download Ini adalah alat kecil yang sangat berguna.
ISQ
5

Saya harus melakukan hal yang sama di sini dan pekerjaan di atas kecuali saya harus memberikan rincian login karena itu adalah repositori buruh pelabuhan lokal.

Itu sesuai dengan di atas tetapi dengan menyediakan nama pengguna / kata sandi di URL.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

Itu kembali sebagai JSON yang tidak diformat.

Saya menyalurkannya melalui formatter python untuk kemudahan membaca manusia, jika Anda ingin memilikinya dalam format ini.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool
Chai
sumber
4

Dengan menggunakan "endpoint" / v2 / _catalog "dan" / tag / list "Anda tidak dapat membuat daftar semua gambar. Jika Anda mendorong beberapa gambar berbeda dan memberi tag "terbaru", Anda tidak dapat mencantumkan gambar lama dengan benar! Anda masih dapat menariknya jika merujuknya menggunakan digest "docker pull ubuntu @ sha256: ac13c5d2 ...". Jadi jawabannya adalah - tidak ada cara untuk membuat daftar gambar Anda hanya dapat mencantumkan tag yang tidak sama

pengguna1616472
sumber
3

Jika ada yang sampai sejauh ini.

Mengambil apa yang orang lain katakan di atas. Berikut ini adalah satu-liner yang menempatkan jawaban ke dalam file teks yang diformat, json.

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

Ini seperti

{
  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]
}

Anda mungkin perlu mengubah `? N = xxxx 'untuk mencocokkan dengan berapa banyak wadah yang Anda miliki.

Berikutnya adalah cara untuk secara otomatis menghapus wadah lama dan tidak terpakai.

nelaaro
sumber
2

Saya menulis alat baris perintah yang mudah digunakan untuk mendaftar gambar dalam berbagai cara (seperti daftar semua gambar, daftar semua tag dari gambar-gambar itu, daftar semua lapisan dari tag-tag itu).

Hal ini juga memungkinkan Anda untuk menghapus gambar yang tidak digunakan dengan berbagai cara, seperti hanya menghapus tag lama dari satu gambar atau dari semua gambar dll. Ini nyaman ketika Anda mengisi registri Anda dari server CI dan hanya ingin menyimpan versi terbaru / stabil.

Ini ditulis dalam python dan tidak perlu Anda mengunduh gambar registri kustom besar yang besar.

anoxis
sumber
2

Berikut adalah contoh yang mencantumkan semua tag dari semua gambar di registri. Ini menangani registri yang dikonfigurasi untuk autentikasi HTTP Basic juga.

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

Penjelasan:

  • ekstrak username: kata sandi dari .docker / config.json
  • buat permintaan https ke registri untuk mendaftar semua "repositori"
  • memfilter hasil json ke daftar nama repositori yang datar
  • untuk setiap nama repositori:
  • buat permintaan https ke registri untuk mendaftar semua "tag" untuk "repositori"
  • filter aliran objek json hasil, mencetak "repositori": "tag" pasang untuk setiap tag yang ditemukan di setiap repositori
Craig Ringer
sumber
1

Utas ini sudah ada sejak lama, alat paling baru yang harus dipertimbangkan adalah skopeodan crane.

skopeomendukung penandatanganan dan memiliki banyak fitur lainnya, sementara craneitu sedikit lebih minimalis dan saya merasa lebih mudah untuk diintegrasikan dengan skrip shell sederhana.

errordeveloper
sumber
0

Karena setiap registri berjalan sebagai sebuah wadah ID wadah memiliki file log terkait ID-json.log file log ini berisi vars.name = [gambar] dan vars.reference = [tag]. Sebuah skrip dapat digunakan untuk memperkirakan dan mencetak ini. Ini mungkin salah satu metode untuk mendaftar gambar yang didorong ke registri V2-2.0.1.

Phil Pinkerton
sumber