Cara menghapus wadah Docker lama

1235

Pertanyaan ini terkait dengan Apakah saya harus khawatir tentang kelebihan, tidak berjalan, wadah Docker? .

Saya bertanya-tanya bagaimana cara menghapus wadah lama. The docker rm 3e552code34amemungkinkan Anda menghapus satu, tapi aku punya banyak sudah. docker rm --helptidak memberikan opsi pilihan (seperti semua, atau dengan nama gambar).

Mungkin ada direktori tempat penyimpanan ini di mana saya bisa menghapusnya dengan mudah secara manual?

qkrijger
sumber
21
Anda juga harus mempertimbangkan membersihkan volume buruh pelabuhan yatim. Saya sering menemukan bahwa mereka mengkonsumsi lebih banyak ruang daripada wadah lama dan gambar lama. Skrip yang bagus untuk menghapus volume buruh pelabuhan yatim tersedia di: github.com/chadoe/docker-cleanup-volumes .
Nemanja Trifunovic
Mungkin github.com/chadoe/docker-cleanup-volumes dapat membantu Anda.
Mihai8
Anda juga dapat menggunakan docker rundengan --rmflag yang akan membuat wadah itu sementara, menghapus semua file wadah setelah proses.
Gordon
12
Dengan docker 1.13 (Q4 2016), Anda juga dapat mempertimbangkan docker system pruneperintah baru . Lihat jawaban saya di bawah ini .
VonC
1
Gunakan alat manajemen buruh pelabuhan Portainer Kami dapat mengelola all the old containers, non using volumes and imagesdengan menggunakan alat ini Ini adalah manajemen UI sederhana untuk buruh pelabuhan Please refer my update below on how to deploy the application
Anish Varghese

Jawaban:

1460

Karena Docker 1.13.x Anda dapat menggunakan wadah Docker prune :

docker container prune

Ini akan menghapus semua kontainer yang berhenti dan harus bekerja pada semua platform dengan cara yang sama.

Ada juga sistem pemangkas Docker :

docker system prune

yang akan membersihkan semua wadah, jaringan, gambar yang tidak digunakan (baik yang menjuntai maupun yang tidak direferensikan), dan secara opsional, volume, dalam satu perintah.


Untuk versi Docker yang lebih lama, Anda dapat merangkai perintah Docker bersama dengan perintah Unix lainnya untuk mendapatkan yang Anda butuhkan. Berikut adalah contoh cara membersihkan wadah lama yang berumur berminggu-minggu:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Untuk memberi kredit, jika sudah jatuh tempo, contoh ini dari https://twitter.com/jpetazzo/status/347431091415703552 .

Ken Cochrane
sumber
92
Perintah serupa untuk menghapus semua gambar yang tidak ditandai: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj
7
@ MichelMüller saat membuat gambar dari dockerfile Anda dapat menentukan -rmopsi untuk menghapus wadah perantara setelah pembuatan yang berhasil.
Freek Kalter
3
@ MichelMüller gambar adalah apa yang digunakan untuk caching, jadi menghapus wadah tidak akan mempengaruhi itu.
Ken Cochrane
7
Jika Anda ingin menggunakan awk untuk ini, pertimbangkan perintah ini jika Anda ingin melakukan semua kontainer yang berhenti (tanpa kesalahan karena baris pertama):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi
3
Ini harus menjadi perintah yang diperbarui untuk menghapus gambar yang tidak ditandaidocker rmi $(docker images -q -f dangling=true)
Ghjnut
626

Metode lain, yang saya dapatkan dari Guillaume J. Charmes (kredit sudah jatuh tempo):

docker rm `docker ps --no-trunc -aq`

akan menghapus semua wadah dengan cara yang elegan.

Dan oleh Bartosz Bilicki, untuk Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Untuk PowerShell:

docker rm @(docker ps -aq)

Pembaruan dengan Docker 1.13 (Q4 2016), kredit untuk VonC ( nanti di utas ini ):

docker system prune akan menghapus SEMUA data yang tidak digunakan (yaitu, dalam urutan: wadah dihentikan, volume tanpa wadah dan gambar tanpa wadah).

Lihat PR 26108 dan komit 86de7c0 , yang memperkenalkan beberapa perintah baru untuk membantu memfasilitasi memvisualisasikan berapa banyak ruang yang diambil data daemon Docker pada disk dan memungkinkan untuk dengan mudah membersihkan kelebihan "yang tidak dibutuhkan".

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
qkrijger
sumber
11
ini entah bagaimana tidak bekerja untuk saya, tetapi docker ps -a -q | xargs docker rmberhasil, (sudo mungkin diperlukan)
FUD
86
bagaimana docker rm $(docker ps -a -q)?
qkrijger
8
@ qkrijger, ini tidak mengubah apa pun dari jawaban asli Anda, kecuali untuk menambahkan bashism. Masalahnya adalah dengan command line overflow. varian xargs berurusan dengannya dengan cara yang baik. Saya juga akan menambahkan --no-trunk ke buruh pelabuhan ps untuk menghindari (tidak mungkin) bentrokan id.
Ihor Kaharlichenko
8
Ketahuilah jika Anda menggunakan wadah data saja, itu juga akan menghapusnya
Dzung Nguyen
4
Saya tidak mengerti maksudnya --no-trunckarena bagaimanapun docker rmjuga tidak memerlukan ID lengkap.
Pithikos
411

Jawaban Diperbarui Gunakan docker system pruneatau docker container prunesekarang. Lihat jawaban terbaru VonC .

Jawaban Sebelumnya Menyusun beberapa petunjuk berbeda di atas, cara paling elegan untuk menghapus semua wadah yang tidak berjalan tampaknya adalah:

docker rm $(docker ps -q -f status=exited)

  • -q hanya mencetak id wadah (tanpa tajuk kolom)
  • -f memungkinkan Anda untuk menyaring daftar wadah cetak Anda (dalam hal ini kami memfilter untuk hanya menampilkan wadah yang sudah keluar)
Ryan Walls
sumber
7
Ini harus menjadi jawaban yang benar karena bergantung pada buruh pelabuhan untuk memberi tahu Anda wadah mana yang tidak lagi digunakan, alih-alih dengan asumsi format output teks $ (gambar buruh pelabuhan) tidak akan berubah. Poin bonus untuk menelurkan hanya satu proses ekstra, bukan dua.
eurythmia
18
Anda mungkin ingin menambahkan -vuntuk menghindari menggantung volume: docker rm -v $(docker ps -q -f status=exited). Lihat docs.docker.com/userguide/dockervolumes/… untuk perincian tentang volume yang menggantung.
rluba
@rluba rupanya di Docker 1.9 akan ada api volume terpisah untuk menangani masalah itu. github.com/docker/docker/pull/14242
Ryan Walls
alias mungkin berguna:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung
Berbeda dengan jawaban yang ditandai benar, jawaban @RyanWalls berfungsi pada OSX dan juga lebih ringkas.
Ray
255

Cara resmi adalah:

docker rm `docker ps -aq`

Pengelola Docker telah mengindikasikan tidak akan ada perintah untuk ini - dan Anda membuat perintah seperti itu:

Kami telah membahas ini sebelumnya dan lebih suka pengguna menggunakan baris di atas tanpa harus menambahkan kode tambahan ke Docker.

Michael Neale
sumber
6
Ini adalah solusi yang buruk, karena itu juga akan menghapus wadah penyimpanan.
Sobrique
8
Apa maksudmu "wadah penyimpanan"? Jika yang Anda maksud hanya wadah data yang dulu digunakan untuk menyimpan referensi ke volume data, itu tidak lagi diperlukan karena ketersediaan docker volumesub- perintah , dan volume yang dinamai.
L0j1k
Perhatikan bahwa ini tidak akan berfungsi di dalam Windows Powershell. Untuk itu, ini adalah solusi yang lebih baik: stackoverflow.com/a/23674294/1150683
Bram Vanroy
@Sobrique Jika Anda tidak bereaksi, setidaknya Anda harus menghapus komentar Anda, itu hampir lengkap dan berbahaya.
peterh
128

Dengan Docker 1.13 (Q4 2016), Anda sekarang memiliki:

docker system prune -a akan menghapus SEMUA data yang tidak digunakan (yaitu, dalam urutan: wadah dihentikan, volume tanpa wadah dan gambar tanpa wadah).

docker system prunetanpa -a akan menghapus (untuk gambar) hanya gambar yang menggantung, atau gambar tanpa tag, seperti yang dikomentari oleh smilebomb .

Lihat PR 26108 dan komit 86de7c0 , yang memperkenalkan beberapa perintah baru untuk membantu memfasilitasi memvisualisasikan berapa banyak ruang yang diambil data daemon Docker pada disk dan memungkinkan untuk dengan mudah membersihkan kelebihan "yang tidak dibutuhkan".

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Sebagai wjv komentar,

Ada juga docker {container,image,volume,network} prune, yang dapat digunakan untuk menghapus instance yang tidak digunakan hanya dari satu jenis objek.

Diperkenalkan pada commit 913e5cb , hanya untuk Docker 1.13+.

docker container prune
VONC
sumber
Terima kasih telah berbagi - agar ini dapat terlihat, saya mengutip Anda dalam jawaban yang tinggi di utas
qkrijger
Seperti biasa, tambahkan -fbendera untuk memaksa pembersihan tanpa ada pertanyaan.
Dirk
3
harus ditandai sebagai jawaban yang benar hari ini, sebagian besar di atas tepat waktu, tetapi nodays terlalu rumit
Eugen Mayer
Setuju, jauh lebih mudah belakangan ini, terserah Anda!
Maxim Geerinck
Deskripsi dalam blok kode adalah untuk docker system prune -a, yang menghapus gambar yang tidak digunakan. docker system prunehanya menghapus gambar yang menggantung , atau gambar tanpa tag.
smilebomb
104

Sekarang dimungkinkan untuk menggunakan pemfilteran dengan docker ps:

docker rm $(docker ps -q -f status=exited)

Dan untuk gambar :

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

Namun, semua itu akan menyebabkan docker rmatau docker rmimelempar kesalahan ketika tidak ada wadah yang cocok. docker rm $(docker ps -aq)Trik yang lebih lama bahkan lebih buruk karena mencoba untuk menghapus wadah yang sedang berjalan, gagal di masing-masing.

Berikut ini skrip yang lebih bersih untuk ditambahkan pada Anda ~/.bashrcatau ~/.profile:

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Sunting: Seperti disebutkan di bawah, jawaban asli adalah untuk menghapus gambar, bukan wadah. Diperbarui untuk menjawab keduanya, termasuk tautan baru ke dokumentasi. Terima kasih kepada Adrian (dan jawaban Ryan) untuk menyebutkan pspemfilteran baru .

caktux
sumber
2
Perhatikan manfaat sebenarnya dari ini - Anda tidak secara tidak sengaja membunuh storageconatiners.
Sobrique
3
Anda juga dapat menggunakan status=createduntuk mendapatkan yang tidak berjalan dan belum pernah berjalan.
enderland
96

DIPERBARUI 2019 (TERBARU)

docker container prune

Ini - 2017 (LAMA) cara

Untuk menghapus SEMUA KONTAINER YANG DIHENTIKAN

docker rm $(docker ps -a -q)

Untuk menghapus SEMUA KONTAINER (DIHENTIKAN DAN TIDAK DIHENTIKAN)

docker rm  -f $(docker ps -a -q)
pungutan
sumber
3
downvoted, karena ini pasti bukan cara Anda melakukannya pada tahun 2017 - jadi docker volume/container/image prune, lihat stackoverflow.com/a/39860665/3625317
Eugen Mayer
6
dipilih untuk melawan downvote karena a) jawaban ini berasal dari 2016, dan b) banyak orang tidak menjalankan pendarahan.
tajam
49

Hapus semua kontainer yang dihentikan:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

Dari komentar oleh pauk960 :

Karena versi 1.3.0 Anda dapat menggunakan filter dengan docker ps, alih-alih grep Exiteddigunakan docker ps -a -f status=exited. Dan jika Anda menggunakannya -qAnda hanya bisa mendapatkan ID kontainer alih-alih output penuh, tidak perlu menggunakan awk untuk itu.

Montells
sumber
33

Jika Anda tidak suka menghapus semua wadah, Anda dapat memilih semua wadah yang dibuat sebelum atau setelah wadah tertentu dengan docker ps --before <container-ID>atau dengan docker ps --since <container-ID>. Fitur ini setidaknya ada di Docker versi 0.6.5.

Katakanlah Anda telah mengembangkan sistem Anda, dan sekarang ia berfungsi, tetapi ada sejumlah kontainer yang tersisa. Anda ingin menghapus wadah yang dibuat sebelum versi yang berfungsi itu. Tentukan ID wadah kerja dengan docker ps.

Hapus wadah yang dibuat sebelum wadah lainnya

docker rm $(docker ps --before 9c49c11c8d21 -q)

Contoh lain. Database Anda sudah berjalan di wadah Docker. Anda telah mengembangkan aplikasi Anda untuk berjalan di wadah lain dan sekarang Anda memiliki sejumlah wadah yang tidak dibutuhkan.

Hapus wadah yang dibuat setelah wadah tertentu

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker menyimpan kontainer di /var/lib/docker/containersdalam Ubuntu. Saya pikir wadah tambahan tidak membahayakan, tetapi mengambil ruang disk.

Vesako
sumber
32

Pembaruan: Pada Docker versi 1.13 (dirilis Januari 2017), Anda dapat mengeluarkan perintah berikut untuk membersihkan wadah yang berhenti, volume yang tidak digunakan, menggantung gambar dan jaringan yang tidak digunakan:

docker system prune

Jika Anda ingin memastikan bahwa Anda hanya menghapus wadah yang exitedberstatus, gunakan ini:

docker ps -aq -f status=exited | xargs docker rm

Demikian pula, jika Anda membersihkan hal-hal buruh pelabuhan, Anda dapat menyingkirkan gambar yang tidak diberi nama dan tidak bernama dengan cara ini:

docker images -q --no-trunc -f dangling=true | xargs docker rmi
L0j1k
sumber
22

Ini docker-cleanupskrip saya , yang menghapus wadah dan gambar yang tidak diberi tag. Silakan periksa sumber untuk setiap pembaruan.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Sumber: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

kebiru-biruan
sumber
@BradMurray Terima kasih! Anda mungkin juga menyukai ini: github.com/blueyed/dotfiles/commit/…
blueyed
3
Tidak bekerja di OSX karena xargs --no-run-if-emptyopsi
caktux
13

Pertama, berhentilah menjalankan wadah sebelum mencoba mengeluarkannya

Hapus wadah yang berjalan

docker rm $(docker stop -t=1 $(docker ps -q))

Anda bisa menggunakan killbukan stop. Dalam kasus saya, saya lebih suka stopkarena saya cenderung memutarkannya kembali vs membuat yang baru setiap kali jadi saya mencoba untuk menutupnya dengan baik.

Catatan: Mencoba menghentikan wadah akan memberi Anda kesalahan:

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

Hapus semua wadah

docker rm $(docker ps -a -q)
Ulises
sumber
11

Menghapus semua kontainer dari shell Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
Bartosz Bilicki
sumber
Saya akan memasukkan ini dalam jawaban saya karena itu adalah halaman pertama. Terima kasih
qkrijger
"dari Windows shell" ? Apakah maksud Anda "menggunakan shell Windows (CMD)" ?
Peter Mortensen
10

https://github.com/HardySimpson/docker-cleanup

Pembersihan buruh pelabuhan

Cangkang all-in-one mungil, yang menghilangkan:

  • Wadah yang tidak berjalan lebih dari satu hari yang lalu
  • Gambar yang bukan milik wadah yang tersisa

Dimaksudkan untuk dijalankan sebagai pekerjaan crontab

Fitur

  • Ini akan menghapus semua <none>:<none>gambar
  • Jika gambar memiliki beberapa referensi repo: tag untuk itu, itu akan menghapus semua tag repo: kecuali dengan menjalankan wadah. Sebenarnya itu adalah sifat "buruh pelabuhan rmi".
  • Banyak pesan kesalahan akan ditampilkan di layar, dan Anda dapat memutuskan 2>/dev/nullatau tidak
  • Pelajari sesuatu dari docker-gc, dan perbaiki masalahnya (tidak dapat menghapus gambar yang memiliki repo mutliple: tag)
HardySimpson
sumber
9

Jadi, secara pribadi saya sarankan melakukan ini sebagai bagian dari skrip penyebaran Anda untuk gambar dan wadah, hanya menyimpan n wadah dan gambar terbaru. Saya memberi tag pada gambar Docker saya dengan skema versi yang sama dengan yang saya gunakan git tagserta selalu memberi tag pada gambar Docker terbaru dengan "latest." Ini berarti bahwa tanpa membersihkan apa pun, gambar Docker saya berakhir seperti:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Sekarang, tentu saja saya tidak ingin menyimpan semua gambar (atau wadah) saya kembali ke keabadian pada semua kotak produksi saya. Saya hanya ingin 3 atau 4 terakhir untuk rollback dan untuk menyingkirkan yang lainnya. Unix's tailadalah teman terbaikmu di sini. Karena docker imagesdan docker pskedua pemesanan berdasarkan tanggal, kami hanya dapat menggunakan tailuntuk memilih semua kecuali tiga teratas dan menghapusnya:

docker rmi $(docker images -q | tail -n +4)

Jalankan itu bersama dengan skrip deploy Anda (atau lokal) untuk selalu menyimpan gambar yang cukup untuk memutar kembali dengan nyaman tanpa mengambil terlalu banyak ruang atau mengacaukan barang-barang dengan gambar lama.

Secara pribadi, saya hanya menyimpan satu kontainer di kotak produksi saya kapan saja, tetapi Anda dapat melakukan hal yang sama dengan kontainer jika Anda menginginkan lebih:

docker rm $(docker ps -aq | tail -n +4)

Akhirnya, dalam contoh sederhana saya, kami hanya berurusan dengan satu repositori pada satu waktu, tetapi jika Anda memiliki lebih banyak, Anda bisa mendapatkan sedikit lebih canggih dengan ide yang sama. Katakanlah saya hanya ingin menyimpan tiga gambar terakhir dari some_repo / some_image. Saya hanya dapat mencampur dalam grepdan awkdan berada di jalan saya:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

Sekali lagi, ide yang sama berlaku untuk wadah, tetapi Anda mendapatkannya pada titik ini jadi saya akan berhenti memberi contoh.

Eli
sumber
8

Menggunakan:

docker rm -f $(docker ps -a -q)

Itu secara paksa berhenti dan menghapus semua kontainer yang ada secara lokal.

Shashank G
sumber
Harap edit dengan informasi lebih lanjut. Jawaban khusus kode dan "coba ini" tidak disarankan, karena tidak mengandung konten yang dapat ditelusuri, dan jangan jelaskan mengapa seseorang harus "coba ini". Kami berusaha di sini untuk menjadi sumber pengetahuan.
Brian Tompsett - 汤 莱恩
Di ubuntu 16.04, buruh pelabuhan membutuhkan sudo, jadi Anda harus menulis sudo docker rm -f $(sudo docker ps -a -q).
Elliott
sebagai nilai tambah, ini juga berfungsi di Windows di bawah PowerShell!
Robert Ivanc
@ Elliott Saya pikir sudodiperlukan di mana-mana kecuali jika Anda menambahkan pengguna Anda ke grup 'buruh pelabuhan'. Saya menggunakan ubuntu 16.10 tanpa sudo dengan menambahkan pengguna saya ke grup buruh pelabuhan.
emory
7

Hapus 5 kontainer tertua:

docker rm `docker ps -aq | tail -n 5`

Lihat berapa banyak wadah yang tersisa:

docker ps -aq | wc -l
Pithikos
sumber
Nice Job @Pithikos. Saya telah menambahkan jawaban yang menghapus semua wadah lama.
Mostafa Ghadimi
7

Hapus semua kontainer yang berhenti.

sudo docker rm $ (sudo docker ps -a -q)

Ini akan menghapus semua kontainer yang dihentikan dengan mendapatkan daftar semua kontainer dengan buruh pelabuhan ps -a -q dan meneruskan id mereka ke buruh pelabuhan. Ini seharusnya tidak menghapus wadah yang sedang berjalan, dan itu akan memberitahu Anda itu tidak dapat menghapus gambar yang sedang berjalan.

Hapus semua gambar yang tidak ditandai

Sekarang Anda ingin membersihkan gambar lama untuk menghemat ruang.

sudo docker rmi $ (gambar sudo docker -q --filter "dangling = true")

Ric_Harvey
sumber
Jangan lupa untuk menghapus volume buruh pelabuhan dengan menentukan opsi -v (sudo docker rm -v $ (sudo docker ps -a -q))
vcarel
Tidak melihat ini, tapi saya kira sama seperti:docker ps -aq | xargs docker rm -v
quine
Ini hanya berfungsi di Linux, bukan Windows ... Tetapi docker rm -f $(docker ps -a -q)berfungsi di PowerShell / Docker untuk Windows.
Peter Mortensen
6

Cara baru: spotify / docker-gc memainkan triknya.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Kontainer yang keluar lebih dari satu jam yang lalu dihapus.
  • Gambar yang bukan milik wadah yang tersisa setelah itu dihapus

Ini telah mendukung pengaturan lingkungan

Memaksa penghapusan gambar yang memiliki banyak tag

 FORCE_IMAGE_REMOVAL=1

Memaksa penghapusan kontainer

 FORCE_CONTAINER_REMOVAL=1 

Tidak termasuk Wadah yang Baru Keluar dan Gambar Dari Pengumpulan Sampah

 GRACE_PERIOD_SECONDS=86400

Pengaturan ini juga mencegah penghapusan gambar yang telah dibuat kurang dari GRACE_PERIOD_SECONDS detik yang lalu.

Lari kering

 DRY_RUN=1

Membersihkan volume kontainer yatim CLEAN_UP_VOLUMES = 1

Referensi: buruh pelabuhan-gc

Cara lama untuk dilakukan:

hapus wadah lama yang tidak berjalan

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

hapus semua gambar yang terkait dengan wadah buruh pelabuhan yang tidak berjalan

 docker images -q | xargs --no-run-if-empty docker rmi

membersihkan volume buruh pelabuhan yatim piatu untuk buruh pelabuhan versi 1.10.x dan di atas

 docker volume ls -qf dangling=true | xargs -r docker volume rm

Berdasarkan periode waktu

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
f-masyarakat
sumber
1
Alternatif yang menarik. +1
VonC
6
  1. Hapus semua proses buruh pelabuhan:

    docker rm $(docker ps -a -q)
    
  2. Hapus wadah tertentu:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    
padakpadak
sumber
5

Anda dapat menggunakan perintah berikut untuk menghapus wadah yang keluar:

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

Berikut adalah intisari penuh untuk juga menghapus gambar lama di buruh pelabuhan: Inti untuk menghapus wadah dan gambar Docker lama .

urodoz
sumber
4
#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done
mckoss
sumber
bagi mereka yang tidak ingin mencarinya sendiri github.com/spotify/docker-gc
grim
Itu sempurna. Saya juga telah menulis jawaban yang memiliki fungsi yang sama.
Mostafa Ghadimi
3

Saya selalu gunakan docker rmi $(docker ps -a -q)untuk menghapus semua gambar.

Anda dapat menghapus direktori /var/lib/docker/graphketika docker rmigagal.

cerah
sumber
Terima kasih telah menambahkan info / var / lib / docker / graph
Jonathan DeMarks
Pertanyaannya adalah bagaimana menghapus wadah, bukan gambar.
pauk960
3

Anda dapat menghapus hanya kontainer yang berhenti. Hentikan semuanya di awal

docker stop $(docker ps -a -q)

Maka Anda bisa menghapus

docker rm $(docker ps -a -q)

Marcin Szymczak
sumber
3

Coba perintah ini untuk membersihkan wadah dan menggantung gambar.

docker system prune -f
Sahabat
sumber
Ini adalah tip yang luar biasa!
B01
3

Langkah-langkah dasar untuk menghentikan / menghapus semua wadah dan gambar

  1. Daftar semua wadah

    docker ps -aq

  2. Hentikan semua wadah yang berjalan

    docker stop $(docker ps -aq)

  3. Hapus semua wadah

    docker rm $(docker ps -aq)

  4. Hapus semua gambar

    docker rmi $(docker images -q)

Catatan: Pertama, Anda harus menghentikan semua wadah yang berjalan sebelum Anda menghapusnya. Juga sebelum menghapus gambar, Anda harus berhenti dan menghapus wadah yang bergantung padanya.

Murali Manchadikkal
sumber
2

Bagi siapa pun yang tertarik, saya mengambil contoh dari qkrijger dan mengubahnya menjadi jelas semua (berhenti dan hapus semua)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
Kraig McConaghy
sumber
Jika Anda melepaskan wadahnya, maka docker rm -f $(docker ps --no-trunc -aq)itu lebih cepat
qkrijger
Benar, tetapi jika Anda memerlukannya untuk mematikan dengan benar untuk membersihkan sumber daya yang digunakan bersama atau digunakan kembali (mis. Volume terlampir, koneksi aktif yang ditutup dengan benar, dll) maka Anda harus menelepon stop dulu. Contoh yang bagus, jika Anda memiliki wadah Jenkins, membunuh wadah itu adalah ide yang buruk. Anda ingin menyimpan perubahan yang tidak diblokir, memperingatkan pengguna yang masuk, dan, yang sangat penting, menghentikan semua build dengan benar.
Kraig McConaghy
setuju, itu adalah kasus penggunaan yang sangat valid
qkrijger
2
#!/bin/bash

echo Cleanup unused containers
unused_containers=$(docker ps -a -q --filter="status=exited")
if [[ -n $unused_containers ]]
then
  docker rm $unused_containers
fi

echo Cleanup unused images
unused_images=$(docker images | grep '^<none>' | awk '{print $3}')
if [[ -n $unused_images ]]
then
  docker rmi $unused_images
fi
AleX
sumber
5
Ketika Anda menjawab, yang terbaik adalah memiliki penjelasan tentang apa yang dilakukan solusinya daripada hanya dump kode, karena jika tidak jawabannya dapat dihapus.
AlBlue
2
docker rm --force `docker ps -qa`
Sivalingam
sumber
2

Saya menggunakan:

docker rm -v $(docker ps -a -q -f status=exited)

untuk menghapus wadah yang keluar dan:

docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")

untuk menyingkirkan semua gambar yang tidak ditandai.

Alexandru Bantiuc
sumber