Pembaruan September 2016: Docker 1.13: PR 26108 dan komit 86de7c0 memperkenalkan beberapa perintah baru untuk membantu memfasilitasi memvisualisasikan berapa banyak ruang yang diambil data daemon buruh pelabuhan pada disk dan memungkinkan untuk dengan mudah membersihkan kelebihan "yang tidak dibutuhkan".
docker system prune
akan menghapus SEMUA data yang menggantung (mis. Agar: kontainer berhenti, volume tanpa wadah dan gambar tanpa wadah). Bahkan data yang tidak digunakan, dengan -a
opsi.
Anda juga memiliki:
Untuk gambar yang tidak digunakan , gunakan docker image prune -a
(untuk menghapus gambar yang menggantung dan tidak diberi gambar).
Peringatan: ' tidak digunakan ' berarti "gambar tidak dirujuk oleh wadah apa pun": hati-hati sebelum menggunakan -a
.
Seperti digambarkan dalam AL 's jawaban , docker system prune --all
akan menghapus semua terpakai gambar bukan hanya menggantung orang ... yang dapat sedikit terlalu banyak.
Menggabungkan docker xxx prune
dengan --filter
opsi bisa menjadi cara yang bagus untuk membatasi pemangkasan ( buruh pelabuhan SDK API 1.28 minimum, jadi buruh pelabuhan 17.04+ )
Filter yang saat ini didukung adalah:
until (<timestamp>)
- hanya menghapus wadah, gambar, dan jaringan yang dibuat sebelum stempel waktu yang diberikan
label
( label=<key>
, label=<key>=<value>
, label!=<key>
, Atau label!=<key>=<value>
) - hanya menghapus kontainer, gambar, jaringan, dan volume dengan (atau tanpa , dalam kasus label!=...
digunakan) label yang ditentukan.
Lihat " Pangkas gambar " untuk contohnya.
Jawaban asli (Sep. 2016)
Saya biasanya melakukan:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
Saya memiliki alias untuk menghapus [gambar menggantung] 13 :drmi
The dangling=true
Filter menemukan gambar yang tidak terpakai
Dengan begitu, gambar perantara apa pun yang tidak lagi dirujuk oleh gambar berlabel dihapus.
Saya melakukan hal yang sama terlebih dahulu untuk proses yang keluar (wadah)
alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
Sebagai haridsv poin di komentar :
Secara teknis, Anda harus terlebih dahulu membersihkan wadah sebelum membersihkan gambar, karena ini akan menangkap lebih banyak gambar yang menggantung dan lebih sedikit kesalahan .
Jess Frazelle (jfrazelle) memiliki fungsi bashrc :
dcleanup(){
docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}
Untuk menghapus gambar-gambar lama, dan bukan hanya gambar-gambar yang "tidak direferensikan", Anda dapat mempertimbangkan docker-gc
:
Wadah Docker sederhana dan skrip pengumpulan sampah gambar.
- Kontainer yang keluar lebih dari satu jam yang lalu dihapus.
- Gambar yang bukan milik wadah yang tersisa setelah itu dihapus.
"dangling=true"
sebenarnya berarti?dcleanup
Mengagumkan!docker system prune
menghapus lebih dari sekedar gambar. Pastikan untuk menggunakannyadocker image prune
sebagai gantinya. Dan berhati - hatilah dengan-a
: adocker system prune -a
dapat memiliki efek yang menghancurkan (menghilangkan volume juga). Akhirnya, ya,-a
menghapus gambar yang tidak digunakan, saya akan mengedit jawabannya.Perbarui yang kedua (2017-07-08):
Rujuk (lagi) ke VonC, gunakan yang lebih baru lagi
system prune
. Yang tidak sabar bisa melewatkan prompt dengan-f, --force
opsi:Selain itu, tidak sabaran dan sembrono dapat menghapus "gambar yang tidak terpakai bukan hanya yang menggantung" dengan
-a, --all
opsi:https://docs.docker.com/engine/reference/commandline/system_prune/
Memperbarui:
Lihat jawaban VonC yang menggunakan
prune
perintah yang baru ditambahkan . Inilah kenyamanan alias shell yang sesuai:Jawaban lama:
Hapus wadah yang terhenti (keluar):
Hapus gambar (menggantung) yang tidak digunakan:
Jika Anda telah menggunakan sangat hati-hati sehubungan dengan kehilangan data yang tidak dapat dibatalkan , maka Anda dapat menghapus volume yang tidak digunakan (menggantung) (v1.9 dan lebih tinggi):
Di sini mereka berada dalam alias shell yang mudah:
Referensi:
docker ps -f
docker rm
docker images -f
docker rmi
docker volume ls
docker volume rm
sumber
docker volume rm
resep. Saya akan menyambut setiap saran yang Anda miliki.docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rm
yang akan berfungsi selama Anda tidak pernah memberi nama volume Anda dengan sesuatu yang mirip dengan panduan. Saya dapat mengubah ini untuk sintaks filter yang baru.Untuk menghapus gambar dengan tag lama yang berumur lebih dari sebulan:
Perhatikan bahwa itu akan gagal untuk menghapus gambar yang digunakan oleh sebuah wadah, direferensikan dalam repositori, memiliki gambar anak yang tergantung ... yang mungkin Anda inginkan. Lain hanya menambahkan
-f
bendera.Contoh
/etc/cron.daily/docker-gc
skrip:sumber
.CreatedSince
menggunakan minggu sebagai satuan waktu dalam output bahkan pada gambar yang banyak minggu, misalnya12 weeks
.docker images | grep ' months' | awk '{ print $3 }' | xargs --no-run-if-empty docker rmi -f
Jawaban lainnya bagus, khususnya:
Tetapi saya membutuhkan sesuatu di tengah-tengah kedua perintah itu sehingga
filter
pilihannya adalah apa yang saya butuhkan:Semoga itu bisa membantu :)
Untuk referensi: https://docs.docker.com/config/pruning/#prune-images
sumber
Dengan anggapan Anda memiliki Docker 1.13 atau lebih tinggi, Anda bisa menggunakan perintah prune. Untuk pertanyaan Anda secara khusus untuk menghapus gambar lama, Anda ingin yang pertama.
Saya akan merekomendasikan untuk tidak terbiasa menggunakan
docker system prune
perintah. Saya rasa pengguna tidak sengaja akan menghapus hal-hal yang tidak mereka maksudkan. Secara pribadi, saya terutama akan menggunakan perintahdocker image prune
dandocker container prune
.sumber
docker system prune
kecuali buah plum.Sampai sekarang (Docker versi 1.12) kami menggunakan perintah berikut untuk menghapus semua kontainer yang berjalan. Juga, jika kita ingin menghapus volume, kita dapat melakukannya secara manual menggunakan masing-masing tag -v pada perintah berikut.
Hapus semua Kontainer yang Keluar
Hapus semua Kontainer yang Dihentikan
Hapus Semua Running dan Stop Kontainer
Hapus semua wadah, tanpa kriteria apa pun
Namun, dalam versi 1.13 dan di atas, untuk sistem lengkap dan pembersihan, kita dapat langsung menggunakan perintah berikut:
Semua wadah, gambar, jaringan, dan volume yang tidak digunakan akan dihapus. Kita juga bisa melakukan ini menggunakan perintah berikut yang membersihkan komponen individu:
sumber
Ini bekerja untuk saya:
sumber
Perintah berikut akan menghapus gambar yang lebih lama dari 48 jam.
sumber
docker image ls --all --filter reference=monolito --filter before=monolito:0.1.8
dan kemudian menerapkan perintah rmi untuk menghapus.docker rmi $(docker image ls -q --all --filter reference=monolito --filter before=monolito:0.1.8)
Baru-baru ini saya menulis skrip untuk menyelesaikan ini di salah satu server saya:
sumber
Berikut ini adalah skrip untuk membersihkan gambar Docker dan mendapatkan kembali ruang tersebut.
Naskah asli
https://github.com/vishalvsh1/docker-image-cleanup
Biasanya Docker menyimpan semua file sementara yang terkait dengan bangunan gambar dan lapisan
/ var / lib / docker
Jalur ini bersifat lokal ke sistem, biasanya di partisi root, "/" .
Anda dapat memasang ruang disk yang lebih besar dan memindahkan konten
/var/lib/docker
ke lokasi pemasangan yang baru dan membuat tautan simbolis.Dengan cara ini, bahkan jika gambar Docker menempati ruang, itu tidak akan mempengaruhi sistem Anda karena akan menggunakan beberapa lokasi pemasangan lainnya.
Posting asli: Kelola gambar Docker pada disk lokal
sumber
Saya menggunakan perintah ini:
Ini akan menghapus semua gambar yang waktu pembuatannya lebih besar dari 10 minggu yang lalu.
sumber
IMAGE_CTIME
danBEFORE_DATETIME
dalamecho
perintah ituJika Anda ingin menghapus gambar yang ditarik X bulan lalu, Anda dapat mencoba contoh di bawah ini yang menghapus gambar yang dibuat tiga bulan lalu:
sumber
Untuk memangkas semua gambar dan volume juga
docker system prune -af --volumes
sumber
docker system prune -a
(Anda akan diminta untuk mengkonfirmasi perintah. Gunakan
-f
untuk memaksa lari, jika Anda tahu apa yang Anda lakukan.)sumber
docker system prune
menghapus bahkan volume bernama-a
.@VonC sudah memberikan jawaban yang sangat bagus, tetapi untuk kelengkapan di sini adalah skrip kecil yang telah saya gunakan --- dan yang juga nukes setiap proses tugas Docker jika Anda memiliki beberapa:
sumber
Error response from daemon: You cannot remove a running container
. Ditambahkandocker kill $(docker ps -q)
sebelum baris 3 ke alamat$(docker images -q)
bukan$(docker images | awk '/<none>/ { print $3 }')
?docker images -q
saya mendapatkan vektor id gambar, tidak ada yang lain. Jika saya melakukan apa yang saya lakukan, saya mendapatkan lebih banyak - memungkinkan saya untuk memfilter<none>
seperti yang saya lakukan di sini. Masuk akal?Untuk menghapus gambar yang ditandai tanpa wadah berjalan, Anda harus menggunakan sedikit skrip:
sumber
Hapus wadah lama beberapa minggu yang lalu.
docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')
Hapus gambar lama minggu lalu. Hati-hati. Ini akan menghapus gambar dasar yang dibuat beberapa minggu yang lalu tetapi mungkin menggunakan gambar baru Anda.
docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')
sumber
Cara menghapus gambar yang ditandai
buruh pelabuhan rmi tag pertama
buruh pelabuhan rmi gambar.
# yang dapat dilakukan dalam satu panggilan rmi docker mis .: # docker rmi <repo: tag> <imageid>
(ini berfungsi November 2016, Docker versi 1.12.2)
misalnya
mis. Script menghapus sesuatu yang lebih dari 2 minggu.
sumber
kekuatan f
-semua
-q dalam mode
sumber
atau
sumber
Kadang-kadang saya mengalami masalah di mana Docker akan mengalokasikan dan terus menggunakan ruang disk, bahkan ketika ruang tersebut tidak dialokasikan untuk gambar tertentu atau wadah yang ada. Cara terbaru yang saya buat untuk masalah ini secara tidak sengaja adalah menggunakan centos build "docker-engine" alih-alih "docker" di RHEL 7.1. Apa yang tampaknya terjadi adalah kadang-kadang pembersihan wadah tidak selesai dengan sukses dan kemudian ruang tidak pernah digunakan kembali. Ketika drive 80GB saya alokasikan sebagai / diisi dengan file / var / lib / docker saya harus datang dengan cara kreatif untuk menyelesaikan masalah.
Inilah yang saya pikirkan. Pertama yang menyelesaikan kesalahan penuh disk:
Pada titik ini saya tidak lagi memiliki disk penuh kesalahan, tetapi saya masih menyia-nyiakan banyak ruang. Langkah selanjutnya adalah mengatasinya.
Start Docker: systemctl start docker
Simpan semua gambar: buruh pelabuhan simpan $ (gambar buruh pelabuhan | sed -e '/ ^ / d' -e '/ ^ REPOSITORI / d' -e 's, [] [] ,:,' -e 's, [ ]. ,, ')> /root/docker.img
Copot pemasangan buruh pelabuhan.
Hapus semua yang ada di / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *
Pasang kembali buruh pelabuhan
Aktifkan buruh pelabuhan: systemctl mengaktifkan buruh pelabuhan
Mulai buruh pelabuhan: systemctl mulai buruh pelabuhan
Pulihkan gambar: memuat buruh pelabuhan </root/docker.img
Mulai wadah persisten yang Anda perlu jalankan.
Ini menurunkan penggunaan disk saya dari 67 GB untuk buruh pelabuhan menjadi 6 GB untuk buruh pelabuhan.
Saya tidak merekomendasikan ini untuk penggunaan sehari-hari. Tapi ini berguna untuk dijalankan ketika sepertinya docker telah kehilangan jejak ruang disk yang digunakan untuk kesalahan perangkat lunak, atau reboot yang tidak terduga.
sumber
Jika Anda ingin secara otomatis / berkala membersihkan wadah yang keluar dan menghapus gambar dan volume yang tidak digunakan oleh wadah yang sedang berjalan, Anda dapat mengunduh gambar
meltwater/docker-cleanup
.Lari saja:
Ini berjalan setiap 30 menit secara default. Namun Anda dapat mengatur waktu tunda dengan menggunakan bendera ini dalam detik (DELAY_TIME = 1800 opsi).
Lebih detail: https://github.com/meltwater/docker-cleanup/blob/master/README.md
sumber
Jika Anda membuat sendiri gambar yang dipangkas ini (dari beberapa gambar dasar lain yang lebih tua) harap berhati-hati dengan solusi yang diterima di atas berdasarkan
docker image prune
, karena perintahnya tumpul dan akan mencoba untuk menghapus juga semua dependensi yang diperlukan oleh gambar terbaru Anda (perintah harus mungkin berganti nama menjadidocker image*s* prune
).Solusi yang saya gunakan untuk pipelines build image docker saya (di mana ada builds harian dan tag = tanggal dalam
YYYYMMDD
format) adalah ini:sumber
Ada sparrow plugin docker-remove-dangling-images yang dapat Anda gunakan untuk membersihkan kontainer yang berhenti dan gambar yang tidak terpakai (dangling):
$ sparrow plg run docker-remove-dangling-images
Ini berfungsi baik untuk Linux dan OS Windows.
sumber
Lari pertama
docker images
untuk melihat daftar gambar dan menyalin IMAGE HASH ID ke clipboard.Lari
docker rmi -f <Image>
Ingat opsi
-f
adalah penghapusan paksa.sumber