Apa itu gambar yang menggantung dan apakah gambar yang tidak digunakan?

155

Dalam dokumentasi buruh pelabuhan dari pemangkasan gambar buruh pelabuhan adalah mungkin untuk menggunakan flag -a untuk

Hapus semua gambar yang tidak digunakan, tidak hanya yang menggantung

dan kemudian

Hapus semua gambar yang menggantung. Jika -a ditentukan, juga akan menghapus semua gambar yang tidak direferensikan oleh wadah apa pun.

Dapatkah seseorang menjelaskan kepada saya apa itu gambar yang menggantung dan apa perbedaan antara gambar yang menggantung dan yang tidak digunakan?

dia
sumber
docker image prune (tanpa -a) melakukan hal yang persis sama
herm
Gagal saat Anda menggunakannya dalam jenkins, kami akan kehilangan cadangan buruh pelabuhan dalam produksi jika kami bergantung pada cache gambar buruh pelabuhan. prunetidak direkomendasikan dalam produksi /
Jinna Balu

Jawaban:

153

Gambar yang tidak digunakan berarti belum ditetapkan atau digunakan dalam wadah. Misalnya, ketika menjalankan docker ps -a- ini akan mencantumkan semua wadah Anda yang sudah keluar dan sedang berjalan. Gambar apa pun yang ditampilkan digunakan di dalam salah satu wadah adalah "gambar bekas".

Di sisi lain, gambar yang menggantung hanya berarti Anda telah membuat gambar yang baru, tetapi gambar itu tidak diberi nama baru. Jadi gambar lama yang Anda miliki menjadi "gambar menggantung". Gambar lama itu adalah " <none>" yang tidak ditandai dan menampilkan " " namanya saat Anda menjalankannya docker images.

Saat berjalan docker system prune -a, itu akan menghapus gambar yang tidak digunakan dan menggantung. Oleh karena itu gambar apa pun yang digunakan dalam wadah, apakah sudah keluar atau sedang berjalan, TIDAK akan terpengaruh.

Serey
sumber
Menurut dokumentasi ketika menjalankan docker pangkas tanpa -sebuah gambar yang menggantung dihapus. -saya akan memastikan bahwa gambar yang tidak digunakan juga dihapus kan? docs.docker.com/engine/reference/commandline/system_prune
herm
1
Sangat menarik. Jadi gambar yang menggantung dapat digunakan oleh wadah. Catatan: Docker memperingatkan Anda jika ada wadah yang menggunakan gambar yang tidak ditandai ini.
Herm
7
docker system prune --all --filter "until=24h"mempertahankan gambar terbaru juga
Harry Moreno
1
Menurut docs.docker.com/engine/reference/commandline/system_prune/… juga docker system prune -a menghapus kontainer yang terhenti. Jadi itu harus menghapus gambar yang terkait hanya dengan wadah yang keluar juga, kan?
lfk
41

Cara teraman dan termudah untuk membersihkan Gambar Menggantung

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Gambar Docker terdiri dari beberapa lapisan. Menggantung gambar, adalah lapisan yang tidak memiliki hubungan dengan gambar apa pun yang ditandai. Mereka tidak lagi melayani tujuan dan menggunakan ruang disk.

Catatan: Saya sarankan untuk tidak menggunakan prunedalam produksi, karena docker system prune -aakan menghapus semua gambar yang tidak direferensikan oleh wadah, dimana kami tidak dapat memutar kembali ke rilis sebelumnya.

Untuk daftar gambar yang menggantung dengan menambahkan bendera filter, -fdengan nilai dangling=trueke docker images.

Daftar gambar Menggantung

docker images -f dangling=true

Hapus Gambar yang Menggantung

docker rmi $(docker images -f dangling=true -q)

ATAU

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Ketika kami menjalankan pekerjaan cron untuk menghapus hal-hal yang menggantung, gunakan hal di atas untuk memastikan pekerjaan tersebut berhasil. Seperti di Jenkins jika kita menjalankan pekerjaan gaya bebas dengan pekerjaan commo beloow tidak akan pernah gagal bahkan jika tidak ada barang yang menggantung di mesin.

Ini adalah cara paling aman dan termudah untuk membersihkan gambar yang menggantung dan mendapatkan kembali ruang disk kami untuk digunakan.

Jinna Balu
sumber
2
bagaimana dengan docker image prune? Documents mengatakan: "Hapus semua gambar yang menggantung. Jika -a ditentukan, juga akan menghapus semua gambar yang tidak dirujuk oleh wadah apa pun." docs.docker.com/engine/reference/commandline/image_prune/…
herm
2
@herm, dari bagian bawah halaman yang Anda referensikan "Catatan: Anda diminta konfirmasi sebelum prune menghapus apa pun, tetapi Anda tidak diperlihatkan daftar apa yang berpotensi dihapus". Saya pikir inti dari jawaban ini adalah bahwa Anda bisa mendapatkan daftar gambar yang menggantung, yang kemudian Anda tentukan secara eksplisit untuk dihapus, sebagai lawan untuk membabi buta menghapus semua gambar menggantung dengan prune.
bzier
Gambar yang memiliki nama dan tag karena tidak ada docker imagesyang digantung. Bagaimana cara memeriksa ukurannya? Juga, gambar yang memiliki nama dan tag karena tidak ada dalam docker images -aadalah gambar perantara. Bisakah mereka dihapus dan bagaimana memeriksa ukurannya?
variabel
17

Gambar di buruh pelabuhan dirujuk oleh intisari sha256, sering disebut sebagai id gambar. Intisari itulah yang Anda butuhkan agar gambar itu ada di host buruh pelabuhan. Biasanya, Anda akan memiliki tag yang mengarah ke intisari ini, mis. Tag busybox: titik terbaru saat ini ke id gambar c30178c523 ... di sistem saya. Beberapa tag dapat mengarah ke gambar yang sama, dan tag apa pun dapat diubah untuk menunjuk ke id yang berbeda, misalnya saat Anda menarik salinan busybox baru: terbaru atau membuat versi baru dari gambar aplikasi Anda.

Gambar menggantung adalah gambar yang tidak memiliki tag, dan tidak memiliki gambar anak (misalnya gambar lama yang menggunakan versi yang berbeda FROM busybox:latest), menunjuk ke sana. Mereka mungkin memiliki tag yang menunjuk ke mereka sebelumnya dan tag itu kemudian berubah. Atau mereka mungkin belum pernah memiliki tag (mis. Output dari docker buildtanpa menyertakan opsi tag). Ini biasanya aman untuk dihapus selama tidak ada wadah yang masih berjalan yang merujuk pada id gambar lama. Alasan utama untuk menjaga mereka di sekitar adalah untuk membangun tujuan caching.

Selain itu, Anda mungkin telah mengunduh gambar yang saat ini tidak digunakan oleh kontainer (termasuk kontainer yang dihentikan). Ini sama sekali berbeda dari gambar yang menggantung dan mungkin aman untuk dihapus selama Anda tidak berencana untuk menggunakannya di masa depan atau tidak keberatan mengunduh salinan lain saat Anda membutuhkannya.

BMitch
sumber
Ketika build docker sedang berjalan (proses di mana ia membuat layer dan kemungkinan kandidat untuk gambar yang menggantung di masa depan), di jendela baru jika saya menjalankan docker image pangkas, maka, akankah hal itu memengaruhi build yang sedang berlangsung dengan cara apa pun?
variabel
@tervariabel mungkin ada kondisi balapan di sana, tetapi biasanya wadah lari untuk langkah pembangunan akan menghasilkan gambar yang diidentifikasi sebagai sedang digunakan. Hal terburuk yang mungkin terjadi adalah prune melempar kesalahan, atau build tidak, dan Anda harus menjalankannya kembali. Saya akan melihat apakah Anda dapat membatasi prune Anda untuk menghindari gambar yang sedang Anda gunakan untuk membangun karena prune yang berhasil akan menghasilkan build berikutnya yang perlu mengunduh gambar lagi.
BMitch
Apakah gambar perantara (gambar yang tidak memiliki nama / tag ditampilkan saat berjalan docker images -a) juga disebut gambar menggantung? Apakah mereka dibersihkan dengan docker image prune?
variabel
Saya tidak lagi memilikinya di lingkungan saya (menggunakan buildkit di sini), jadi saya sarankan Anda mencoba sendiri di lingkungan lab untuk melihat apa yang terjadi.
BMitch
Yang mengatakan, menghapus "gambar" yang tidak ditandai dari tahap perantara adalah cukup sia-sia, kecuali Anda menghapus gambar yang ditandai terakhir, semua lapisan digunakan kembali dalam gambar kemudian dan tidak dapat dihapus. Jika Anda menghapusnya, Anda menghancurkan cache build Anda dan menyebabkan semua gambar di masa depan mengambil lebih banyak waktu untuk membangun dan ruang disk untuk menyimpan.
BMitch
5

Gambar yang menggantung adalah lapisan yang tidak memiliki hubungan dengan gambar yang ditandai. Mereka tidak lagi melayani tujuan dan menggunakan ruang disk.

Gambar yang tidak digunakan adalah gambar yang belum ditetapkan atau digunakan dalam wadah.

Daftar gambar Menggantung

docker images -f dangling=true
subh2273
sumber
3

gambar yang menggantung adalah gambar yang tidak ditandai. Perintah berikut memberikan daftar gambar yang menggantung.

docker images --filter "dangling=true"

docker image prune menghapus semua gambar yang menggantung.

Gambar yang tidak digunakan adalah gambar yang memiliki tag tetapi saat ini tidak digunakan sebagai wadah. Anda mungkin atau mungkin tidak membutuhkannya di masa depan.

docker image prune -a hapus semua gambar yang menjuntai dan tidak digunakan.

Anda biasanya tidak ingin menghapus semua gambar yang tidak digunakan sampai beberapa saat. Karena itu lebih baik untuk menghapus dengan filter.

docker image prune -f --filter "until=6h"

Venkat Kotra
sumber
1) Apakah docker image prune -a -f --filter "until=6h"juga menghapus gambar yang menggantung?
variabel
2) Dalam perintah terakhir yang Anda sebutkan docker image prune -f --filter "until=6h"- karena tidak ada -a - lalu kenapa itu akan menghapus gambar yang tidak digunakan?
variabel
0

Saya melihat perintah yang berguna (alias) untuk menghapus gambar yang menggantung, milik andyneff di sini: https://forums.docker.com/t/how-to-delete-cache/5753 :

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 

Yang pertama membersihkan semua gambar yang menggantung. Ini berguna untuk menghapus gambar setengah jadi dari beberapa build. Yang kedua adalah untuk mengeluarkan kontainer yang berhenti. Ini adalah alias yang saya gunakan untuk pemeliharaan rutin

Jika Anda ingin menghapus SEMUA cache Anda, pertama-tama Anda harus memastikan semua kontainer dihentikan dan dihapus, karena Anda tidak dapat menghapus gambar yang digunakan oleh sebuah wadah. Jadi sesuatu yang mirip

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

Ini akan membunuh dan menghapus semua gambar dalam cache Anda.

Alexei Martianov
sumber
0

Dalam tangkapan layar gambar, nama "tidak ada" adalah gambar yang menggantung. Gambar yang menggantung hanya berarti bahwa Anda telah membuat bangunan gambar yang baru, tetapi itu tidak diberi nama baru. Jadi gambar lama yang Anda miliki menjadi "gambar menggantung". Gambar lama itu adalah yang tidak diberi tag dan menampilkan "" namanya saat Anda menjalankan gambar buruh pelabuhan.

docker system prune -a, itu akan menghapus gambar yang tidak terpakai dan menggantung. Oleh karena itu, gambar apa pun yang digunakan dalam wadah, apakah sudah keluar atau sedang berjalan, TIDAK akan terpengaruh.

Nirbhay Singh
sumber