Saya menjalankan registry buruh pelabuhan pribadi, dan saya ingin menghapus semua gambar kecuali latest
dari repositori. Saya tidak ingin menghapus seluruh repositori, hanya beberapa gambar di dalamnya. The docs API tidak menyebutkan cara untuk melakukan hal ini, tapi pasti itu mungkin?
163
Jawaban:
Saat ini Anda tidak dapat menggunakan API Pendaftaran untuk tugas itu. Ini hanya memungkinkan Anda untuk menghapus repositori atau tag tertentu.
Secara umum, menghapus repositori berarti bahwa semua tag yang terkait dengan repo ini dihapus.
Menghapus tag berarti, bahwa hubungan antara gambar dan tag dihapus.
Tidak satu pun di atas akan menghapus satu gambar. Mereka dibiarkan di disk Anda.
Penanganan masalah
Untuk solusi ini, Anda harus menyimpan gambar buruh pelabuhan Anda secara lokal.
Solusi untuk solusi Anda adalah menghapus semua kecuali tag terbaru dan dengan demikian berpotensi menghilangkan referensi ke gambar terkait. Kemudian Anda dapat menjalankan skrip ini untuk menghapus semua gambar, yang tidak dirujuk oleh tag apa pun atau keturunan dari gambar apa pun yang digunakan.
Terminologi (gambar dan tag)
Pertimbangkan grafik gambar seperti ini di mana huruf (
A
,B
, ...) mewakili ID image pendek dan<-
sarana bahwa gambar didasarkan pada gambar lain:Sekarang kita menambahkan tag ke gambar:
Di sini, tag
<version1>
referensi gambarC
dan tag<version2>
referensi gambarD
.Saring pertanyaan Anda
Dalam pertanyaan Anda, Anda mengatakan ingin menghapus
. Sekarang, terminologi ini tidak sepenuhnya benar. Anda telah mencampur gambar dan tag. Melihat grafik saya pikir Anda akan setuju bahwa tag tersebut
<version2>
mewakili versi terbaru. Bahkan, menurut pertanyaan ini, Anda dapat memiliki tag yang mewakili versi terbaru:Karena
<latest>
tag mereferensikan gambar,D
saya bertanya: apakah Anda benar-benar ingin menghapus semua kecuali gambarD
? Mungkin tidak!Apa yang terjadi jika Anda menghapus tag?
Jika Anda menghapus tag
<version1>
menggunakan Docker REST API Anda akan mendapatkan ini:Ingat: Docker tidak akan pernah menghapus gambar! Bahkan jika itu terjadi, dalam hal ini tidak dapat menghapus gambar, karena gambar
C
adalah bagian dari keturunan untuk gambarD
yang ditandai.Bahkan jika Anda menggunakan skrip ini , tidak ada gambar yang akan dihapus.
Kapan suatu gambar bisa dihapus
Di bawah kondisi yang dapat Anda kontrol ketika seseorang dapat menarik atau mendorong ke registri Anda (misalnya dengan menonaktifkan antarmuka REST). Anda dapat menghapus gambar dari grafik gambar jika tidak ada gambar lain yang didasarkan padanya dan tidak ada tag yang merujuknya.
Perhatikan bahwa dalam grafik berikut, gambar
D
ini tidak didasarkan padaC
tetapi padaB
. Karena itu,D
tidak bergantung padaC
. Jika Anda menghapus tag<version1>
pada grafik ini, gambarC
tidak akan digunakan oleh gambar apa pun dan skrip ini dapat menghapusnya.Setelah pembersihan grafik gambar Anda terlihat seperti ini:
Apa ini yang kau inginkan?
sumber
Saya telah menghadapi masalah yang sama dengan registri saya kemudian saya mencoba solusi yang tercantum di bawah ini dari halaman blog. Berhasil.
Langkah 1: Mendaftar katalog
Anda dapat mendaftar katalog Anda dengan menghubungi url ini:
Respons akan dalam format berikut:
Langkah 2: Cantumkan tag untuk katalog terkait
Anda dapat mencantumkan tag katalog Anda dengan menghubungi url ini:
Respons akan dalam format berikut:
}
Langkah 3: Daftar nilai manifes untuk tag terkait
Anda dapat menjalankan perintah ini dalam wadah register buruh pelabuhan:
Respons akan dalam format berikut:
Jalankan perintah yang diberikan di bawah ini dengan nilai manifes:
Langkah 4: Hapus manifes yang ditandai
Jalankan perintah ini dalam wadah register buruh pelabuhan Anda:
Ini config.yml saya
sumber
Deleteing blob: /docker/...
" tetapi tidak mengubah ruang disk yang digunakan. Menggunakan bin / registry github.com/docker/distribution v2.4.1 .Docker-Content-Digest
bagian harus dalam huruf kecil (diuji pada mesin buruh pelabuhan v18.09.2) yaitucurl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
v2
Registri saat ini sekarang mendukung penghapusan viaDELETE /v2/<name>/manifests/<reference>
Lihat: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image
Penggunaan yang berfungsi: https://github.com/byrnedo/docker-reg-tool
Sunting: Manifes di
<reference>
atas dapat diambil dari meminta keGET /v2/<name>/manifests/<tag>
dan memeriksa
Docker-Content-Digest
header di respons.Sunting 2: Anda mungkin harus menjalankan registri dengan set env berikut:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Sunting3: Anda mungkin harus menjalankan pengumpulan sampah untuk membebaskan ruang disk ini: https://docs.docker.com/registry/garbage-collection/
sumber
DELETE
.{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Masalah 1
Anda menyebutkan itu adalah registry buruh pelabuhan pribadi Anda, jadi Anda mungkin perlu memeriksa API Registri alih-alih Hub registry API doc , yang merupakan tautan yang Anda berikan.
Masalah 2
API docker registry adalah protokol klien / server, terserah implementasi server apakah akan menghapus gambar di back-end. (Saya kira)
Penjelasan detail
Di bawah ini saya mendemonstrasikan cara kerjanya sekarang dari deskripsi Anda sebagai pemahaman saya untuk pertanyaan Anda.
Anda menjalankan Anda menjalankan registry buruh pelabuhan pribadi, saya menggunakan yang default dan mendengarkan di
5000
portLalu saya memberi tag pada gambar lokal dan mendorongnya.
Setelah itu Anda dapat menggunakan API Pendaftaran untuk memeriksa keberadaannya di registri buruh pelabuhan pribadi Anda
Sekarang saya dapat menghapus tag menggunakan API itu !!
Periksa lagi, tag tidak ada di server registri pribadi Anda
sumber
registry
gambar kanonik . SSHing dan menjalankan skrip berfungsi, bahkan jika itu tidak ideal. Sebagai catatan saya masih berpikir itu adalah API yang tidak lengkap - Anda dapat menghapus tag, tetapi jika Anda MENDAPAT/images
Anda masih melihat semua data gambar yang tersisa.Ini benar-benar jelek tetapi berfungsi, teks diuji pada registri: 2.5.1. Saya tidak berhasil menghapus berfungsi dengan lancar bahkan setelah memperbarui konfigurasi untuk mengaktifkan penghapusan. ID itu benar-benar sulit untuk diambil, harus masuk untuk mendapatkannya, mungkin beberapa kesalahpahaman. Bagaimanapun, yang berikut ini berfungsi:
Login ke wadah
Tentukan variabel yang cocok dengan versi wadah dan wadah Anda:
Pindah ke direktori registri:
Hapus file yang terkait dengan hash Anda:
Hapus manifes:
Keluar
Jalankan GC:
Jika semua dilakukan dengan benar, beberapa informasi tentang gumpalan yang dihapus ditampilkan.
sumber
Ada beberapa klien (dengan Python, Ruby, dll) yang melakukan hal itu. Untuk selera saya, itu tidak berkelanjutan untuk menginstal runtime (misalnya Python) di server registri saya, hanya untuk mengurus registri saya!
Jadi
deckschrubber
solusi saya:gambar yang lebih tua dari usia tertentu akan dihapus secara otomatis. Umur dapat ditentukan dengan menggunakan
-year
,-month
,-day
, atau kombinasi dari mereka:UPDATE : inilah pengantar singkat tentang deckschrubber.
sumber
deckschrubber
cukup bagus - sangat mudah untuk menginstal (biner tunggal), dan memungkinkan Anda menghapus gambar berdasarkan nama (dengan pencocokan regex) serta usia.ERRO[0000] Could not delete image! repo=.... tag=latest
: /Secara singkat;
1) Anda harus mengetik perintah berikut untuk RepoDigests dari repo buruh pelabuhan;
2) Gunakan API REST registri
Anda harus mendapatkan 202 diterima untuk doa yang berhasil.
3-) Jalankan Pengumpul Sampah
registri - nama wadah registri.
Untuk penjelasan lebih rinci, masukkan deskripsi tautan di sini
sumber
Gambar buruh pelabuhan ini mencakup skrip bash yang dapat digunakan untuk menghapus gambar dari registri v2 jarak jauh: https://hub.docker.com/r/vidarl/remove_image_from_registry/
sumber
Di Bawah Bash Script Menghapus semua tag yang terletak di registri kecuali yang terbaru.
Setelah Jalankan ini
sumber
Skrip ruby sederhana berdasarkan jawaban ini : registry_cleaner .
Anda dapat menjalankannya di mesin lokal:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
Dan kemudian pada mesin registry hapus gumpalan dengan
/bin/registry garbage-collect /etc/docker/registry/config.yml
.sumber
Berikut ini skrip berdasarkan jawaban Yavuz Sert. Itu menghapus semua tag yang bukan versi terbaru, dan tag mereka lebih besar dari 950.
sumber