Moby: Terapkan perintah 'bersih'

Dibuat pada 19 Jun 2013  ·  103Komentar  ·  Sumber: moby/moby

Akan menyenangkan memiliki perintah yang membersihkan buruh pelabuhan:

  • Gambar tanpa tag
  • Wadah yang lebih tua dari 1 minggu (atau mungkin 24 jam?)

Ini dapat dilakukan melalui perintah tingkat atas baru 'docker clean' atau melalui opsi ke 'docker rm' dan 'docker rmi'.

Saya pikir akan lebih baik untuk memiliki sisi server ini daripada sisi klien.

Komentar yang paling membantu

Sekarang sudah lebih dari 2 tahun sejak utas ini dimulai dengan banyak saran tambahan yang tidak memerlukan kumpulan skrip, seperti docker rm --stopped dan docker rmi --untagged , dll. Karena saya masih menerima pemberitahuan tentang yang satu ini, mari kita rayakan dengan remix klasik.

You have ten seconds

Semua 103 komentar

Akan sulit untuk menemukan definisi umum dari "bersih". Bagaimana jika saya punya?
database produksi berjalan selama berbulan-bulan atau bertahun-tahun? Apakah harus dibersihkan? :)

Pada Selasa, 18 Jun 2013 pukul 17:04, Guillaume J. Charmes <
[email protected]> menulis:

Akan menyenangkan memiliki perintah yang membersihkan buruh pelabuhan:

  • Gambar tanpa tag
  • Wadah yang lebih tua dari 1 minggu (atau mungkin 24 jam?)

Ini dapat dilakukan melalui perintah tingkat atas baru 'docker clean' atau melalui
opsi untuk 'docker rm' dan 'docker rmi'.

Saya pikir akan lebih baik untuk memiliki sisi server ini daripada sisi klien.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/dotcloud/docker/issues/928
.

Setuju, itu sebabnya masuk akal untuk mengambil 2 dimensi untuk perintah clean. Jumlah waktu sejak awal terakhir + tanggal pembuatan.

Misalnya, bersihkan semua wadah yang dibuat lebih dari 30 hari yang lalu dan yang belum dimulai selama 1 minggu.

Catatan: durasi lari juga merupakan petunjuk yang bagus! (Kemungkinannya, itu berumur pendek
wadah dapat dibuang.)

Pendekatan favorit saya adalah meningkatkan 'gambar buruh pelabuhan' dan 'pekerja buruh pelabuhan'
dengan pemfilteran tingkat lanjut, dan kemudian membuatnya mudah untuk menyalurkannya ke 'buruh pelabuhan
rm' dan 'buruh rmi'. Lebih unix-y :)

Pada Sel, 18 Jun 2013 pukul 18:20, Jérôme Petazzoni
[email protected] menulis :

Catatan: durasi lari juga merupakan petunjuk yang bagus! (Kemungkinannya, itu berumur pendek
wadah dapat dibuang.)


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/dotcloud/docker/issues/928#issuecomment -19655690
.

Ini memang tampak seperti jenis fitur yang diinginkan setiap orang dengan cita rasa mereka sendiri. Mungkin fitur follow on adalah untuk membuat setara dengan alias git, jadi jika seseorang ingin memiliki docker clean mereka dapat melakukannya dengan caranya sendiri, dan mulai sekarang dengan melakukan filter unix-y dan hal-hal pipa.

Proposal saya adalah sebagai berikut.

A) memungkinkan penandaan kontainer. Izinkan deskripsi (mungkin unik) (seperti 'Database info pengguna') juga, yang akan membuat daftar penampung menjadi lebih mudah dibaca dan informatif.
B) kemudian terapkan opsi seperti docker rm -a , yang akan menghapus semua wadah yang tidak ditandai, dan mungkin docker rm -a --hard yang akan menghapus semua wadah.

Menurut pendapat saya, ini akan memberikan banyak nilai di atas kemungkinan yang sudah ditawarkan oleh perintah unix standar.

+1 ke docker clean . Itu akan sangat bagus, docker ps -a tidak kembali dalam waktu yang wajar (10+ menit) sekarang.

Ini hanya akan menjadi lebih buruk.

Hai Nick, dengan pembaruan terbaru (0.4.6), 'docker ps -a' seharusnya cepat
lagi. Yang memperlambatnya adalah menghitung ukuran setiap kontainer di
terbang, dan kami memindahkannya ke bendera opsional (-s).

Pada Minggu, 23 Juni 2013 pukul 21:38, Nick Stinemates
[email protected] menulis :

+1 untuk membersihkan buruh pelabuhan. Itu akan sangat bagus, docker ps -a tidak kembali
dalam jumlah waktu yang wajar (10+ menit) sekarang.

Ini hanya akan menjadi lebih buruk.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/dotcloud/docker/issues/928#issuecomment -19888761
.

Dikonfirmasi. Upgrade sangat membantu!

keeb@li253-7:~$ docker ps -a | wc -l
502

Saya berpikiran terbelah tentang konsep perintah bersih. Komentar yang mengatakan itu akan menjadi luar biasa benar, seperti yang menyarankan bahwa bersih adalah sesuatu yang semua orang ingin rasa mereka sendiri.

Sepertinya ini memiliki banyak kesamaan dengan membangun pengumpul sampah ... tetapi tidak ada definisi yang jelas tentang apa yang merupakan referensi yang kuat, karena mungkin saja perintah buruh pelabuhan ingin merujuk ke sebuah wadah yang berakhir secara sewenang-wenang jarak yang lalu di waktu atau dalam menjalankan wadah berikutnya.

Seperti yang saya katakan sebelumnya: apa yang ingin saya lihat adalah cara _querying_ yang ditingkatkan
gambar dan wadah. Itu dapat digunakan untuk penghapusan dengan pemipaan ke 'docker
rm', tetapi juga untuk hal-hal lain.

Pada Wed, 26 Jun 2013 pukul 03:55, Eric Myhre [email protected] :

Saya berpikiran terbelah tentang konsep perintah bersih. Komentar
mengatakan itu akan sangat baik adalah benar, seperti yang menyarankan itu
bersih adalah sesuatu yang semua orang ingin rasa mereka sendiri.

Sepertinya ini memiliki banyak kesamaan dengan membangun tempat sampah
kolektor... tapi tidak ada definisi yang jelas tentang apa yang dimaksud dengan yang kuat
referensi, karena mungkin saja perintah buruh pelabuhan ingin merujuk ke a
wadah yang berakhir dengan jarak yang sangat jauh yang lalu dalam waktu atau dalam
kontainer berikutnya berjalan.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/dotcloud/docker/issues/928#issuecomment -20086211
.

Silakan lihat #1077

Saya pikir itu menyediakan cara yang baik untuk menangani hal-hal sementara tanpa mengganggu hal lain.

Bagaimana dengan: docker ps -a | cut -c-12 | xargs docker rm

@SeyZ Ini memang berfungsi tetapi hanya akan menghapus wadah dan semuanya.
btw, Anda juga dapat menggunakan docker rm docker ps -a -q``

Saya memilih untuk menerapkan perintah 'bersih' yang berfungsi untuk gambar dan wadah. Docker menggunakan banyak ruang disk dan meninggalkan banyak hal yang tergeletak di sekitar. Di lingkungan dengan ruang disk terbatas tanpa menggunakan skrip bash samar untuk membersihkan sejumlah besar barang sisa dari docker run dan docker build.

Saya harus menggunakan skrip bash berikut untuk membersihkan wadah:

docker ps -a | cut -c-12 | xargs docker rm

Dan ini untuk membersihkan gambar:

images=`sudo find /var/lib/docker/graph/ -maxdepth 1 -type d -printf "%f "`
docker rmi $images

Kasus penggunaan saya:

Build a docker file.
Push it to a private repository
Pull the docker to a production box
Run it
Hook it up into nginx
Kill the old docker.

Serangkaian langkah pada push box dan server aplikasi ini memakan 1/2 hingga 2 g setiap kali dilakukan baik pada kotak build maupun server aplikasi. Pada mesin 20GB, tidak ada ruang.

Tampaknya menjadi sesuatu yang seharusnya menjadi bagian dari meriam perintah.. Itu harus mudah, jelas dan didokumentasikan dengan baik.

gambar bersih buruh pelabuhan
wadah bersih buruh pelabuhan

atau

buruh pelabuhan rm -a [--keras]
buruh pelabuhan rmi -a [--keras]

Mungkin ada sesuatu yang penting yang saya lewatkan tentang mengelola wadah dan gambar yang dapat saya lakukan untuk membuatnya lebih mudah dikelola?

@robblovel

Anda dapat melakukan ini sekarang:

hapus semua wadah

docker rm `docker ps -a -q`

**delete all images**
docker rmi `docker images -q`

Saya pikir intinya adalah bahwa buruh pelabuhan tampaknya meninggalkan banyak barang tergeletak di sekitar, baik gambar maupun wadah. Saya tidak tahu di mana semua ruang di hard drive saya sampai saya menemukan beberapa keajaiban yang didokumentasikan dan tidak didokumentasikan. Saya pikir penting untuk benar-benar memikirkan kembali caching pembuatan gambar dan keseluruhan grafik. Ketika saya membangun sebuah wadah, saya harus dapat memutuskannya dari semua asosiasi lain sehingga independen dari semua asosiasi tersebut. Saya seharusnya bisa menghapus bagasi cache tanpa khawatir gambar yang baru saja saya buat kacau. Saya juga harus dapat mematikan wadah dan menghilangkannya sepenuhnya dari disk.

Sebuah sampingan terkait dengan masalah ini:
Menandai sesuatu untuk memindahkannya ke registri lain tidak dapat diterima sebagai solusi, ini tidak intuitif dan menciptakan sambungan yang tidak perlu antara registri. Repo pribadi saya, yang publik, dan yang lokal tidak boleh memiliki asosiasi satu sama lain. Saya harus dapat melakukan "docker Push [nama gambar] [registry_url]" dan membuat gambar independen saya didorong ke sana tanpa bagasi, tidak ada koneksi dari mana saya mendorong.

Saya hanya mencoba menghubungkan pengalaman saya sebagai pengguna baru. Apa yang non-intuitif adalah perbedaan antara registri dan repositori dan fakta bahwa ketika saya membangun sesuatu atau menjalankan sesuatu ada banyak bagasi tergeletak di sekitar jika Anda terus-menerus membangun dan menghapus gambar, dan menjalankan dan membunuh kontainer.

Misalnya: ini adalah sesi di mana saya menghapus barang, seperti yang Anda lihat, ada sekitar 23 GB ruang dari sisa wadah buruh pelabuhan yang dimatikan:

Dari disk penuh ....

buruh pelabuhan ps -a | potong -c-12 | xargs buruh pelabuhan rm

Kesalahan: Tidak ada wadah seperti itu: ID

Kesalahan: Tidak mungkin menghapus wadah yang sedang berjalan, harap hentikan dulu

d46a31743a91
c6ba4a162585
...
1036 baris dihapus di sini...
...
75b387dabb63
2627552d6c84

df -h

Ukuran Sistem File yang Digunakan Tersedia Penggunaan% Dipasang di
/dev/xvda1 63G 40G 20G 67% /

Kami beralih ke solusi untuk masalah ini dengan 2 peningkatan yang sebagian diimplementasikan di 0.6.6 dan akan berlanjut di cabang 0.7:

  • "Grafik" gambar dan wadah sedang disatukan, sehingga Anda dapat melacak garis keturunan wadah atau gambar apa pun di semua wadah dan gambar.
  • Wadah dan gambar akan diberi nama secara default, dengan kemungkinan memiliki banyak nama.

Dengan sistem ini, nama dapat digunakan untuk penghitungan referensi dan pengumpulan sampah. Jika wadah atau gambar turun menjadi 0 nama, itu dapat dihapus dengan aman. Ini akan menangani wadah atau gambar yang tersisa setelah pembuatan, wadah sementara, dll.

Ini berarti kita tidak memerlukan perintah "bersih". Oleh karena itu saya menutup masalah ini :)

Bagi mereka yang ingin menghapus wadah buruh pelabuhan yang berhenti, membiarkannya berjalan, dan menginginkan kode keluar nol jika tidak ada kesalahan, gunakan yang berikut ini. Kami membutuhkannya selama penerapan otomatis, dan melihat kesalahan "Tidak mungkin menghapus wadah yang sedang berjalan" yang muncul dengan lebih banyak baris penghapusan "brute force" yang diberikan dalam komentar di atas.

docker ps -a | grep "Exit " | grep -v "CONTAINER ID" | cut -c-12 | xargs -L1 bash -c 'if [ $0 == 'bash' ] ; then : ; else docker rm $0; fi'

Tidak yakin di mana ini hari ini, tetapi pikirkan FWTW:

sesuatu seperti docker clean harus memiliki mode (atau ini harus terpisah (sub) perintah) seperti:

  • prune (default): hapus hanya wadah yang menggantung* + gambar
  • all-except-tagged : hapus semua kecuali wadah yang diberi tag + gambarnya
  • all-except-running : hapus semua wadah + gambar kecuali yang sedang berjalan sekarang
  • all : hapus semuanya

*menjuntai berarti wadah tidak berada di "cabang" saat ini. Anda dapat menganggap wadah yang diberi tag sebagai cabang bernama di git. Semua wadah komit ketergantungan harus tetap di-cache (untuk tujuan pembangunan kembali). Tetapi semua wadah yang tidak diberi tag atau dependensi dari yang diberi tag, harus dihapus. Pikirkan ini seperti "pengumpulan sampah", daripada "bersih". Mungkin docker gc .

@shykes perintah bersih masih diperlukan untuk benar-benar melakukan pengumpulan sampah setelah gambar berjalan ke 0 hitungan referensi.

@shykes Saya juga ingin meminta Anda untuk mempertimbangkan kembali penutupan tiket ini tanpa resolusi seperti yang disarankan oleh @jbenet di https://github.com/dotcloud/docker/issues/928#issuecomment -33217851. Saya mengalami masalah ruang disk yang serius setelah membangun dan membangun kembali gambar puluhan kali.

@shykes Saya setuju dengan @dscho @drewcrawford - Fungsi docker clean masih hilang. Memiliki nama untuk wadah tidak terlalu membantu jika Anda masih perlu menghapus masing-masing wadah secara manual (atau menggunakan pipa cangkang buatan tangan). Silakan buka kembali masalah ini.

Ini sangat membuat frustrasi ketika penerapan otomatis gagal.

Saya menjalankan docker images | grep '<none>' | grep -P '[1234567890abcdef]{12}' -o | xargs -L1 docker rmi dan docker ps -a | grep \"Exit \" | grep -v \"CONTAINER ID\" | cut -c-12 | xargs -L1 bash -c 'if [ $0 == 'bash' ] ; then : ; else docker rm $0; fi' dan mendapatkan sekitar 4Gb kembali. Menghapus penampung dan gambar yang dihentikan tanpa tag.

Sebagai contoh yang lebih sederhana:

# delete all stopped containers (because running containers will harmlessly error out)
docker rm $(docker ps -a -q)
# delete all untagged images
docker rmi $(docker images | awk '/^<none>/ { print $3 }')

saya secara teratur harus mencari perintah ini, jadi tulis tutorial kecil tentang perintah pembersihan yang berguna - http://blog.stefanxo.com/2014/02/clean-up-after-docker/

akan lebih bagus jika ini bisa menjadi fitur asli di cli

@mastef saya setuju; Jika perintah 'docker' utama tidak boleh dipolusi dengan fungsionalitas seperti ini, mungkin dalam bentuk perintah dockerutils ? misalnya dockerutils cleanupimages dll.

(otoh - skrip dockerutils dapat dikembangkan sebagai hal/kontribusi pihak ketiga)

Bisa jadi sesuatu, atau sebagai parameter untuk docker rm dan docker rmi ? - misalnya docker rm --stopped dan docker rmi --untagged

@mastef Saya kira itu bisa menjadi opsi, tetapi sudah ada begitu banyak flag/opsi/perintah di buruh pelabuhan sehingga Anda mungkin harus mencari parameter itu juga :smile:

Tidak yakin apakah ini lokasi yang tepat untuk diskusi ini, misalnya di docker-dev / docker-user, atau bahwa masalah terpisah harus dibuat. Mungkin seseorang dari pengembang 'inti' dapat menyinari? @tianon ?

Fakta bahwa saya memiliki 19 gigs wadah/gambar yang tidak digunakan adalah konyol. Jika tidak ditandai, saya tidak menginginkannya. Saya tidak harus membersihkan kekacauan buruh pelabuhan.

@thaJeztah ada banyak opsi yang jarang digunakan di buruh pelabuhan; tapi yang ini digunakan terus-menerus.

@mastef setuju. Melihat kembali ide Anda, mungkin bagus untuk diterapkan seperti yang Anda usulkan; yaitu docker rm --stopped atau, mungkin lebih baik docker rm --clean dan docker rmi --clean agar tetap konsisten.

Perhatian ekstra harus diberikan saat menerapkan docker rm --clean karena wadah yang dihentikan masih dapat digunakan sebagai wadah data saja/volume, tetapi saya kira API dapat memeriksa apakah wadah tersebut masih digunakan/ditautkan.

Saya suka ide membuatnya lebih eksplisit dan sederhana

docker rm --stopped bagus, melakukan persis seperti yang tertulis di kotak

docker rmi --untagged tampaknya lebih jelas daripada --clean

Saya setuju dengan @shykes bahwa definisi bersih akan berubah tergantung pada orangnya, tetapi berhenti dan tidak ditandai, itu adalah konsep buruh pelabuhan.

Harus menggunakan perintah berantai yang lebih sulit untuk diingat yang melibatkan awk adalah komplikasi yang tidak perlu pada alur kerja umum.

Silakan buka kembali ini, ini benar-benar menyakitkan bagi pendatang baru.

docker rm `docker ps --no-trunc -a -q`

Adalah salah satu perintah buruh pelabuhan yang paling sering saya ketik sejak saya mulai bereksperimen, terlihat sangat aneh untuk tidak memilikinya secara asli.

@mgcrea Anda tidak perlu --no-trunc dan Anda dapat mengelompokkan opsi, Anda dapat melakukan:

docker rm `docker ps -aq`

:senyum:

+1 solusi @mastef

+1 @mastef juga

FYI, saya telah menggunakan skrip Shell @blueyed dari sini https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

Ini dilakukan dengan baik.

:+1:

Sebagai catatan, untuk menghilangkan gambar yang menggantung:

docker rmi $(docker images --filter dangling=true --quiet)

@yajo Saya telah melihat ini sekarang didokumentasikan di sini juga: http://docs.docker.com/reference/commandline/cli/

@wyaeld Skrip itu sepertinya tidak berfungsi untuk saya. Script itu sendiri tidak melakukan apa-apa dan tidak memberikan output. Tetapi ketika saya mencoba menjalankan perintah secara manual saya mendapatkan kesalahan sintaks untuk awk:

josh@ThinkPad-T430 ~ docker ps -a | tail -n +2 | awk '$2 ~ "^[0-9a-f]+$" {print $'$1'}'
awk: cmd. line:1: $2 ~ "^[0-9a-f]+$" {print $}
awk: cmd. line:1:                            ^ syntax error

Tidak yakin mengapa itu tidak berhasil, saya memiliki seluruh tim yang menggunakannya di banyak mesin tanpa masalah.

Mungkin versi bash atau awk Anda tidak biasa

Aneh. Saya menggunakan versi yang ada di Ubuntu 14.04. Saya pikir itu mungkin karena saya menggunakan zsh, tetapi saya memuat bash dan menjalankannya lagi dan mendapatkan kesalahan yang sama.

@ingenium13
Anda tidak dapat menjalankannya secara manual seperti ini: $1 di $'$1' dimaksudkan sebagai argumen fungsi dan harus 0 atau 1. Jadi yang berikut ini akan berfungsi: docker ps -a | tail -n +2 | awk '$2 ~ "^[0-9a-f]+$" {print $0}' .

Coba pahami apa yang dilakukan skrip/fungsi: mungkin semua gambar/wadah Anda ditandai? Lihatlah output dari kolom ke-2 docker ps -a misalnya.

Tapi itu di luar topik di sini, dan Anda sebaiknya mengangkat masalah di dotfiles saya tentang hal itu.

Juga, setidaknya harus ada output seperti ini (ketika tidak ada yang dibersihkan):

Removing containers:
Removing images:

@tianon @ingenium13 Untuk kompatibilitas dengan shell lain, saya sarankan untuk menyalurkan output melalui xargs :

alias docker-clean='docker ps -a -q | xargs -r docker rm'

Saya telah memasukkan baris ini ke .zshrc saya dan itu bekerja dengan sangat baik.

@stucki Anda tidak perlu membuka pipa atau menggunakan xargs :

Untuk wadah:

docker rm $(docker ps -aq)

Untuk gambar:

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

begitu banyak solusi berdasarkan cangkang yang berbeda

bagaimana dengan perintah asli buruh pelabuhan sekarang?

@razic Saya mengetahui solusi ini, tetapi sejauh yang saya mengerti posting sebelumnya, kutipan dari $ menyebabkan masalah. Dengan xargs ini tidak diperlukan.

Selain itu, xargs lebih baik ketika Anda memiliki banyak kotak, karena ia membagi daftar menjadi beberapa eksekusi jika daftar argumen menjadi terlalu panjang...

@mastef :+1: ;-)

@stucki saran yang bagus, thx

Promosi gambar saya yang tidak tahu malu yang menghapus semua gambar yang tidak digunakan oleh wadah apa pun: https://github.com/bobrik/docker-image-cleaner. Ini juga tersedia dari registri buruh pelabuhan sebagai bobrik/image-cleaner .

@Yajo :+1 :

docker rm $(docker ps -aq)
docker rmi $(docker images --filter dangling=true --quiet)

@mastef :+1: untuk "begitu banyak solusi berdasarkan shell yang berbeda / bagaimana dengan perintah asli buruh pelabuhan sekarang?"

@masterf :thumbsup: ke "begitu banyak solusi berdasarkan shell yang berbeda / bagaimana dengan perintah asli buruh pelabuhan sekarang?"

docker rmi --untagged dan docker rm --stopped akan sangat bagus. Menghapus ambiguitas berpendirian apa pun tentang arti 'bersih' dan menyediakan fungsionalitas yang tampaknya dicari oleh kebanyakan orang di sini.

Ya! +1 @chrisfosterelli

+1 untuk format sederhana dari @chrisfosterelli

Opsi --stopped dapat mengambil argumen opsional dalam bentuk string filter waktu untuk membersihkan hanya wadah yang lebih tua dari X.

+1 untuk setidaknya rmi --stopped , tetapi docker clean akan lebih baik.

Kami memiliki pergantian gambar yang tinggi dan terus-menerus kehabisan ruang disk karena skrip baris perintah tidak bekerja dengan andal.

Bukankah sudah waktunya untuk membuka kembali masalah ini? Memiliki perintah bersih yang tepat dan mudah diingat benar-benar hilang di kotak peralatan kami.

docker rmi tidak menghasilkan daftar gambar - itu hanya menghapus persis apa yang diperintahkan.

Daftar itu dapat dibuat menggunakan docker ps --filter... -

@mikehaertl Saya menyarankan agar PR proposal yang menambahkan opsi --filter tambahan yang menambahkan lebih banyak filter yang membantu mendefinisikan konsep 'bersih' (misalnya, filter untuk menunjukkan semua wadah belum berjalan lebih dari satu pekan?).

@hobofan - jika skrip tidak bekerja dengan andal, maka silakan bekerja dengan orang lain untuk menyelesaikannya - terutama karena saran @chrisfosterelli adalah menambahkan kode ke buruh pelabuhan di mana ia akan memanggil hal yang persis sama seperti skrip Anda - jadi temukan tahu mengapa gagal akan memblokir implementasi go juga

misalnya

docker rmi --stopped akan sama dengan mengetik docker rmi $(docker ps -qa --filter status=exited ) - dan jika itu gagal dalam skrip - kemungkinan besar juga akan gagal di buruh pelabuhan karena alasan yang sama.

mm, dan saya tidak tahu apa artinya docker rmi --untagged , karena Anda tidak dapat mengubah nama wadah - apakah itu berarti, hapus semua wadah yang didasarkan pada gambar yang sekarang tidak memiliki tag?

@SvenDowideit Skrip lebih mudah rusak, karena perbedaan dalam implementasi shell dan perubahan output dari perintah buruh pelabuhan. Tentu saja Anda bisa menggunakan Docker API, tetapi itu akan membuat beberapa skrip rumit.

docker ps -q sama dengan `docker ps | awk '{ print $1}', tetapi karena itu adalah sesuatu yang sering dibutuhkan, itu sudah ada di dalamnya.

Saat ini bahkan tidak ada cara untuk menghapus gambar yang sesuai untuk sebuah wadah jika saya benar, apalagi cara untuk menampilkan id gambar untuk sebuah wadah. docker ps -q mengembalikan container-id sementara docker rmi membutuhkan image-id.

menambahkan lebih banyak opsi --filter terdengar masuk akal dan mungkin merupakan langkah ke arah yang benar, tetapi dalam jangka panjang, perintah clean bawaan yang dapat diakses melalui API akan sangat membantu alat yang membangun Docker (misalnya Mesos).

saran saya adalah untuk menyelinap pada mereka dengan menambahkan filter :)

+1 @chrisfosterelli

Catatan, saat membersihkan gambar dan wadah, berhati-hatilah saat menghapus wadah dan gambar dari instance buruh pelabuhan yang aktif. Kami mengalami masalah dengan pembersihan gambar selama pembangunan buruh pelabuhan. Dan yang lain telah melaporkan membersihkan wadah. https://github.com/docker/docker/issues/8663

Masalah ini ditutup satu setengah tahun yang lalu karena "kami akan memiliki pengumpulan sampah, jadi tidak perlu perintah pembersihan". Sejauh yang saya tahu, masih belum ada proses GC seperti itu, dan pengguna masih berjuang untuk mengendalikan penggunaan ruang disk Docker mereka. Bisakah kita membuka kembali tiket ini sampai ada solusi nyata yang bisa kita gunakan?

+1 @stevenschlansker; setidaknya harus ada metode "praktik terbaik" yang disepakati.

Saat ini saya menggunakan:

docker rmi $(sudo docker images --no-trunc=true --filter dangling=true --quiet)

tetapi tampaknya agak kasar dan cenderung menghapus gambar dari bawah wadah yang sedang berjalan (walaupun saya belum melakukannya).

+1 untuk membuka kembali.

Saya belum melihat gambar keluar dari bawah wadah, tetapi saya telah melihat kegagalan saat membuat gambar Mereka terlihat seperti ini:

23:48:33 Step 7 : RUN useradd -u 1001 -m buildfarm 23:48:36 ---> Running in b12de18eeda1 23:48:38 ---> a59d6862a9ca 23:48:38 Removing intermediate container b12de18eeda1 23:48:38 Step 8 : RUN mkdir /tmp/keys 23:48:41 time="2015-02-21T07:48:41Z" level="info" msg="no such id: 07042adaa5f5d74a927301ca83fb641e0ecf49b18329e442cda5eef26c3f1429" 

Untuk tujuan kami, skrip pembersihan kami telah berkembang menjadi 176 baris python untuk menjaga sistem kami berjalan tanpa mogok. Dan kami harus mempertahankan banyak ruang disk kosong karena selama durasi pembangunan berkelanjutan yang lama, kami tidak dapat membersihkan gambar dan wadah secepat kami dapat membuatnya.

Jika ada yang ingin melihat skrip pembersihan kami ada di sini: https://github.com/ros-infrastructure/buildfarm_deployment/blob/master/slave/slave_files/files/home/jenkins-slave/cleanup_docker_images.py

Ini adalah skrip python yang diparameterisasikan pada ruang kosong yang diperlukan dan persentase bebas dan titik pemasangan apa untuk memeriksa ruang disk. Ini memiliki opsi untuk usia minimum untuk dihapus. Dan itu mencatat aktivitas untuk ditinjau nanti.

Ia menggunakan klien python buruh pelabuhan untuk mengintrospeksi wadah dan gambar dan kemudian mengurutkan dan memfilternya sebelum menghapusnya hingga ruang disk yang diperlukan tersedia atau tidak ada yang tersisa.

Saya punya masalah, ketika saya menghapus wadah yang dihentikan, mereka mulai lagi setelah beberapa hari. Ketika saya menghapus wadah dengan ="Sudo docker rm containername" penggunaan volume (GB) server saya adalah sama. Bagaimana saya bisa menghapus wadah dengan tepat untuk mendapatkan penggunaan volume server (GB) saya kembali?

Bagaimana saya bisa melihat berapa banyak ruang (volume) yang digunakan wadah saya?

Untuk apa nilainya, saya baru saja mengalami masalah di mana perintah buruh pelabuhan bawaan untuk membersihkan gambar lama akan menghemat banyak waktu saya.

Saya menggunakan Hudson untuk menyebarkan aplikasi baru di wadah Docker. Pekerjaan Hudson menghentikan wadah lama, menghapus gambar bernama, lalu menarik yang baru dan memulainya. Sayangnya, saya mulai kehabisan ruang, dan akhirnya secara tidak sengaja menghentikan beberapa wadah saat saya sedang membersihkan.

Mencurigai ada sesuatu yang kacau dengan pemasangan gambar, saya mem-boot ulang, menghapus semua wadah dan gambar, dan memindahkan semuanya. Bukan masalah besar, sekitar 15 menit. Namun, saya menemukan bahwa setelah proses ini saya mendapatkan kembali sekitar 8G ruang disk, yang pada instans 20G cukup besar.

Untuk menjalankan dalam produksi, saya mengharapkan cara yang didukung untuk menghindari kekacauan ini. Tentu kita dapat membuat skrip jalan keluar darinya, tetapi bagi saya tampaknya solusi sebenarnya harus datang dari Docker.

Saya ingin menekankan kembali poin @thaJeztah sebelumnya karena ada banyak kebisingan di utas ini. Sebagian besar skrip yang dijelaskan di sini untuk mengatasi opsi clean hilang akan menghapus wadah volume.

Hati-Hati.

Sebagian besar skrip yang dijelaskan di sini untuk mengatasi opsi pembersihan yang hilang akan menghapus wadah volume.

@kojiromike Itu sebabnya saya menyarankan ini: https://github.com/docker/docker/issues/10839 . Jika tidak setiap wadah akan mendapatkan nama secara default (apa gunanya itu?), Akan mudah untuk menemukan wadah yang dapat dibersihkan tanpa bahaya.

@mikehaertl Memutuskan apakah sebuah wadah dapat dihapus dengan aman dengan adanya nama sama sewenang-

@hobofan Idenya adalah, untuk menghapus wadah _tanpa_ nama. Dengan cara ini Anda dapat dengan aman mencegah penampung volume Anda dihapus dengan memberi mereka nama. Ini tentu saja tidak berfungsi sekarang, karena _setiap_ wadah selalu mendapat nama, karena fitur penamaan otomatis (IMO tidak berguna).

@mikehaertl Saya mengerti itu, tetapi gagasan bahwa semua wadah dengan nama harus dilindungi dari penghapusan tampaknya sangat sewenang-wenang bagi saya dan tidak akan menyelesaikan masalah umum, tetapi hanya melindungi wadah volume. Metode yang lebih baik untuk memecahkan masalah itu pada 1.6.0 akan melabeli wadah yang ingin Anda lindungi dengan cara tertentu dan kemudian memfilternya (sayangnya belum ada bendera filter untuk label).

sayangnya belum ada bendera filter untuk label

Sebenarnya, ada, tapi iirc itu tidak ada di dokumen setelah rilis 1.6 :)

  1. Penamaan otomatis bukannya tidak berguna, itu luar biasa.
  2. Nama tidak boleh dibebani dengan tanggung jawab sebagai indikator apakah wadah bersifat sementara atau tidak.
  3. Label masuk akal, meskipun pendekatan sesi dalam permintaan tarik awal juga masuk akal.

Kami serius mempertimbangkan untuk menggunakan jpetazzo/dind untuk meniru sesi di sini. Setelah kami selesai dengan pekerjaan, kami dapat melepaskan wadah dind dan kami akan tahu pasti bahwa kami mendapatkan semua wadah yang dikandungnya.

+1 untuk opsi TTL pada tarikan tag

Maaf karena tidak membaca seluruh masalah, pencarian untuk TTL tidak menunjukkan hasil jadi... inilah proposal saya.

Saya mengusulkan untuk menambahkan opsi TTL pada tag tarik gambar.
Pada lingkungan CD, registri akan menyimpan banyak gambar yang tidak diperlukan... :/

Untuk pembersihan / pengumpulan sampah otomatis, ada "Sherdock", yang dibuat selama hackathon DockerCon 2015; https://github.com/rancher/sherdock http://rancher.com/sherdock/

Maaf, proposal saya bukan untuk menambahkan clean pada volume lokal tetapi ya untuk penarikan registri. Registri akan tahu apakah gambar harus hidup atau tidak dan mungkin kita bisa menerapkannya juga pada volume lokal (dengan mengangkut TTL dari registri ke server buruh pelabuhan).

Bagaimana ini masih menjadi masalah yang luar biasa? Sherdock hebat tetapi hanya jika Anda memiliki sistem yang mampu mem-boot wadah lain -- Saya tidak melihat opsi di antarmuka web untuk mengelola sistem jarak jauh.

Seluruh platform saya mati karena disk penuh, lebih buruk lagi tidak ada perintah di atas yang benar-benar berfungsi dalam kasus saya. Kecuali Sherdock (lihat di atas).

Apakah ada solusi yang lebih baik daripada beberapa skrip Shell dan satu liner?

Memang, Sherdock terlihat sangat menarik -- tetapi jika Anda mengelola puluhan mesin host, memiliki UI web sangat kontraproduktif. Solusi yang tepat harus skrip dan otomatis.

Kami telah menjalankan kombinasi dari beberapa skrip di atas, tetapi sayangnya kami menemukan itu

  • Tampaknya tidak ada yang dapat membersihkan semua sumber daya yang bocor dengan andal, masing-masing melakukan beberapa subset yang sedikit berbeda
  • Mereka semua masuk ke direktori Docker internal, yang rapuh -- memutakhirkan ke 1.7 menyebabkan skrip pembersihan kami secara diam-diam menghapus volume dan lapisan gambar yang sedang digunakan (!)
  • Mereka semua mengalami kondisi balapan -- jika Anda membuat daftar gambar, memeriksa apakah gambar itu digunakan, dan kemudian mencoba menghapusnya, seseorang mungkin akan mencoba menggunakan gambar itu secara bersamaan dan menyebabkan kesalahan. Sangat sulit untuk mengetahui apakah kesalahan ini adalah kegagalan aktual atau hanya masalah konkurensi

Saya masih tidak dapat melihat alasan apa pun masalah ini harus ditutup, jelas ini adalah titik nyeri yang memengaruhi banyak pengguna Anda yang berada paling jauh di jalur "menjalankan Docker dalam produksi", dan solusi di luar inti tampaknya sangat sulit/tidak mungkin untuk mengimplementasikan dengan benar.

Saya suka bagaimana buruh pelabuhan membuat hidup saya sebagai pengembang jauh lebih mudah. Misalnya dengan alat-alat seperti menulis, menjadi sangat mudah untuk berbagi pengaturan pengembangan yang agak rumit bahkan dengan rekan kerja desainer saya dalam beberapa menit.

Kemudian lagi setelah beberapa waktu Anda mengetahui tentang bagian-bagian yang tidak begitu baik dan Anda benar-benar mulai bertanya-tanya: _Apa ..!?_ Klaimnya adalah "termasuk baterai" - tetapi entah bagaimana itu hanya setengah dari kebenaran. Ini seperti Anda membutuhkan 4 baterai tetapi hanya 3 yang disertakan. Docker benar-benar dapat berperilaku seperti "kutu sampah" ketika Anda melihat apa yang terjadi pada hard drive Anda setelah bermain-main dengannya untuk sementara waktu.

Manual tidak benar-benar menyebutkan ini dan Anda perlu mencari tahu sendiri, bagaimana cara membuang semua sampah yang tersisa dari buruh pelabuhan (dengan volume yang ditinggalkan menjadi hal yang menyakitkan untuk dihapus - Anda perlu menemukan "baterai" pihak ke -

Bagi saya rasanya seperti banyak energi sekarang dimasukkan ke dalam memperluas tumpukan alat buruh pelabuhan sementara beberapa fitur yang sangat mendasar tetapi masih penting diabaikan begitu saja - bahkan jika pengguna memintanya lagi dan lagi.

kontribusi pertama saya untuk utas ini adalah permintaan pul untuk batas waktu sesi untuk wadah buruh pelabuhan (untuk membersihkan secara otomatis)

sekarang --rm diimplementasikan, saya merasa kebutuhan untuk pembersihan tidak terlalu mendesak. meskipun saya memiliki skrip bash untuk pembersihan di setiap server yang agak canggung.

Karena utas ini tidak mengalami kemajuan apa pun ... saya pikir kita harus menyarankan fitur baru yang sesuai dengan gambaran besar atau membiarkannya pergi.

Akan selalu ada fitur baru untuk ditambahkan, bug lama untuk diperbaiki, dll. (Perhatikan, ada lebih dari 900 masalah, dan lebih dari 100 PR, dan kami menggabungkan atau menutup lebih dari 100 PR per minggu).

Khususnya, docker clean bukan pendekatan yang benar dan itulah sebabnya mengapa ini ditutup. Apa yang akan kamu bersihkan?
Gambar menggantung? docker rmi $(docker images --filter dangling=true)
Kontainer yang dihentikan? buruh pelabuhan rm $( buruh pelabuhan ps -aq)

docker clean tidak menambahkan apa pun selain perintah tambahan yang hanya berguna untuk sebagian kecil pengguna... dan kemudian hanya gula sintaksis.

@cpuguy83
dengan argumentasi itu Anda mengambilnya sedikit mudah. Jelas ada kebutuhan untuk melakukan pengumpulan sampah yang tepat. sesuatu buruh pelabuhan masih kurang.

sementara saya sepenuhnya setuju untuk tidak menerapkan gula sintaksis sederhana, memang ada sesuatu yang hilang.

Saya pikir setiap kali masalah tertutup mendapat banyak perhatian, kita harus melihat penyebabnya, dan jika buruh pelabuhan benar-benar kehilangan sesuatu yang diperlukan.

jadi tolong, mari kita cari ide-ide konstruktif untuk mengisi celah dengan fitur yang masuk akal untuk setiap peserta.

Untuk opsi jarak jauh untuk menghapus gambar Docker yang tidak digunakan, saya adalah bagian dari proyek yang mencoba menyelesaikan ini (CloudSlang) menggunakan SSH/REST untuk menghapus gambar dari Host, dan masih memberikan fleksibilitas pada logika.
Berikut adalah blog tentang cara menghapus cluster CoreOS menggunakannya: https://www.digitalocean.com/community/tutorials/how-to-clean-up-your-docker-environment-using-cloudslang-on-a-coreos -kluster-2

Kami dapat menguraikannya untuk memberikan lebih banyak kemampuan "pembersihan" ...

Saya pikir setidaknya perintah yang berguna untuk menggantung gambar dan menghentikan wadah dan sejenisnya harus ditempatkan di area dokumen yang terlihat sebelum masalah ini ditutup. Mungkin bagian terkait atau area FAQ, atau bahkan bagian "Mempertahankan Docker Jangka Panjang" yang dapat memandu pengguna ke berbagai arah. Dengan begitu kami memaparkan berbagai macam pembersihan yang bisa dilakukan, dengan titik awal untuk melakukannya.

Gambar menggantung? buruh pelabuhan rmi $(gambar buruh pelabuhan --filter menjuntai=true)
Kontainer yang dihentikan? buruh pelabuhan rm $( buruh pelabuhan ps -aq)

docker clean tidak menambahkan apa pun selain perintah tambahan yang hanya berguna untuk sebagian kecil pengguna... dan kemudian hanya gula sintaksis.

Ini berguna karena pengguna tidak terlalu sering membersihkan gambar mereka. Biasanya setiap 1-3 bulan. Pada saat itu semua orang lupa cmd yang akan digunakan. Sedangkan docker clean dapat diperiksa untuk man dan --help dengan mudah. Jika penggunaan lebih lanjut diperlukan selain dari docker rmi $(docker images --filter dangling=true) . Heck setiap kali saya lupa dan harus mencarinya. Tidak berguna.

Mengalami masalah ini (lagi) dan harus menelusuri masalah Docker (lagi) untuk memperbaikinya. +1 untuk gula sintaksis.

@ cpuguy83 Juga, "gula sintaksis" yang Anda usulkan sebenarnya tidak benar. Misalnya, perintah Anda docker rmi $(docker images --filter dangling=true) tunduk pada kondisi balapan -- perintah Anda dapat berpacu dengan docker run dari gambar yang sebelumnya menjuntai dan menyebabkan kesalahan.

Ini bukan kondisi ras hipotetis. Ini memengaruhi hampir 50% dari proses pembersihan kami (masing-masing membutuhkan waktu puluhan menit untuk dijalankan, dan kami menjadwalkan _banyak_ tugas!)

Hal ini membuat hampir tidak mungkin untuk menulis implementasi yang benar yang dapat membedakan antara mode kegagalan, dan operator perlu memilah semuanya secara manual. Yang menyebalkan ketika Anda memelihara sekelompok 100 mesin yang terus-menerus mengisi disk mereka.

+1 ke @stevenschlansker
Kami memiliki situasi yang sangat mirip dengan yang dijelaskan oleh @stevenschlansker. Kami mencoba untuk mengatasi masalah ini dengan menggunakan --rm , tetapi ada kalanya wadah tidak keluar dengan anggun dan dibiarkan berkeliaran.

Mungkin ada sesuatu seperti DELETE /images?filter=<filter spec> dan kita dapat mengunci grafik selama proses itu.

Tetapi saya juga berpikir seharusnya tidak ada masalah ras saat memanggil rmi sini kecuali rmi sedang dalam proses tetapi gambar masih tersedia untuk run . Harus melihat.

Pasti setuju, penghapusan gambar cukup terburu-buru.
Ini akan membutuhkan banyak pekerjaan untuk dibersihkan... Saya telah membuka masalah untuk dilacak: #16982

Terima kasih telah melihat. Adalah baik untuk memiliki validasi bahwa kita belum (belum) kehilangan akal;)

@stevenschlansker terima kasih untuk itu! Kami perlu mencegah penambahan fitur yang tidak benar-benar diperlukan (atau dapat diselesaikan secara wajar dengan cara lain), tetapi dalam kasus ini Anda benar bahwa "solusi" bukanlah solusi :+1:

Berikut adalah contoh lain mengapa situasi ini benar-benar menyebalkan. Lihat salah satu skrip terbaik yang saya temukan sejauh ini untuk "membersihkan" Docker:

https://github.com/chadoe/docker-cleanup-volumes/blob/master/docker-cleanup-volumes.sh

Tidak hanya itu sangat rumit, ada beberapa bug yang menyebabkannya menghapus volume yang sedang digunakan dari wadah yang sedang berjalan: https://github.com/chadoe/docker-cleanup-volumes/issues/19

Dan ini adalah keadaan seni. Saya membuat kesalahan dengan memutakhirkan ke Docker 1.8.3 kemarin dan membuat bug ini tersandung. Sekarang pagi ini saya mendapat sekitar tiga puluh pengguna yang marah datang kepada saya menanyakan di mana data mereka ... tapi semuanya hilang :(

Ya. Saya juga membuat kesalahan dengan menggunakan alat pihak ke-3 untuk melakukan apa yang disebut 'membersihkan' volume saya yang tidak digunakan. Itu baru saja menghapus semua volume buruh pelabuhan saya ... Benar-benar tidak suka itu.

Seorang teman dan saya menyusun skrip yang mungkin dapat membantu beberapa dari Anda. Skrip menjalankan beberapa perintah yang difilter menggunakan docker-clean [option flags] . Kami menggabungkannya untuk membantu merampingkan menjalankan banyak perintah yang sama di beberapa mesin dan telah menjadi bagian besar dari alur kerja buruh pelabuhan kami.

Lihat dan beri tahu kami pendapat Anda dan buka masalah apa pun dengan fitur yang ingin Anda lihat atau garpu dan tarik!

https://github.com/ZZROTDesign/docker-clean

alias buruh pelabuhan-bersih = ' buruh pelabuhan rm $( buruh pelabuhan ps -a -q) && buruh pelabuhan rmi $(gambar buruh pelabuhan -q) && buruh pelabuhan ps -a | potong -c-12 | xargs buruh pelabuhan rm'
Menghapus wadah buruh pelabuhan lalu gambar buruh pelabuhan dan terakhir membersihkan cache

Sekarang sudah lebih dari 2 tahun sejak utas ini dimulai dengan banyak saran tambahan yang tidak memerlukan kumpulan skrip, seperti docker rm --stopped dan docker rmi --untagged , dll. Karena saya masih menerima pemberitahuan tentang yang satu ini, mari kita rayakan dengan remix klasik.

You have ten seconds

Ini ditangani oleh sub-perintah prune sekarang.

  • docker builder prune (untuk menghapus cache build lama)
  • docker container prune
  • docker image prune
  • docker network prune
  • docker volume prune

Untuk melakukan semuanya sekaligus:

  • docker system prune (tidak menghapus volume apa pun secara default)

    • jalankan docker system prune --volumes untuk menghapus volume juga.

Dokumen:

(Berkomentar untuk siapa pun yang masih membaca utas ini, misalnya ditautkan di sini dari StackOverflow.)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat