Bagaimana saya bisa menghapus gambar Docker?

265

Saya memiliki gambar-gambar berikut:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

dan ketika saya mencoba untuk menghapus salah satu dari mereka saya dapatkan:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

Bagaimana saya bisa menghapusnya? Mengapa ada konflik seperti itu?

alexyz78
sumber

Jawaban:

478

Untuk menghapus semua gambar, gunakan perintah yang diberikan

docker rmi $(docker images -q)

Untuk menghapus semua kontainer, gunakan perintah yang diberikan

docker rm $(docker ps -a -q)

Peringatan: Ini akan menghancurkan semua gambar dan wadah Anda. Tidak mungkin mengembalikannya!

Solusi ini disediakan oleh Techoverflow.net .

Cerah
sumber
17
Sederhana dan lurus. Anda juga di bawah ini perintah untuk memaksa menghapus gambar. 'buruh pelabuhan rmi -f $ (gambar buruh pelabuhan -q)'
dimuthu
37
Setara windows powershell adalahdocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot
1
Pertama saya menggunakan cmd pada @muheed How to Answer ( stackoverflow.com/a/30475249/2747020 ) untuk membuka kunci penghapusan beberapa gambar:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar
1
Windows Powershell untuk kontainer buruh pelabuhandocker ps -a -q | %{docker rm -f $_}
Dexter
1
Seperti yang dituliskan @ alexyz78 di bawah ini, sekarang Anda dapat menggunakan docker system prune. Jadi untuk menghapus semuanya: docker kill $(docker ps -q)untuk menghentikan kontainer yang diikuti oleh docker system prune -aakan menghapus semuanya - lihat stackoverflow.com/a/44309011/247708
Bharat
101

Alasan yang mungkin: Alasannya adalah bahwa gambar ini saat ini digunakan oleh wadah yang sedang berjalan. Jika demikian, Anda dapat membuat daftar wadah yang sedang berjalan, menghentikan wadah yang relevan dan kemudian menghapus gambar:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

Jika Anda tidak dapat menemukan wadah dengan buruh pelabuhan ps, Anda dapat menggunakan ini untuk mendaftar semua wadah yang sudah keluar dan menghapusnya.

docker ps -a | grep 60afe4036d97
docker rm <containerid>

Catatan: Hati-hati menghapus semua wadah yang keluar sekaligus jika Anda menggunakan Volume-Onlywadah. Ini tetap dalam Exitkeadaan, tetapi berisi data yang berguna .

Jiri
sumber
Sebenarnya, Anda akan mendapatkan pesan yang menjelaskan hal itu. Mungkin gambar lain berdasarkan yang ini? Coba hapus gambar apa pun yang Anda buat dari gambar ini terlebih dahulu.
qkrijger
12
Saya dapat menghapus gambar dengan sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(terima kasih kepada github.com/dotcloud/docker/issues/3258 ) dan kemudian dengansudo docker rmi 70c0e19168cf
alexyz78
2
Hati-hati menghapus gambar dalam Exitkeadaan. Jika Anda menggunakan wadah hanya volume data, mereka tidak tetap berjalan.
aceofspades
1
awk can grep:awk '/Exit/ {print $1}'
Dwight Spencer
Perintah Anda membuang ini Error response from daemon: No such container: .... Sulit untuk mengatakan apa yang harus diganti, dan apa yang harus saya ganti. Jangan gunakan...
Felo Vilches
60

Alasan untuk kesalahan ini adalah bahwa meskipun gambar tidak memiliki tag, masih ada wadah yang dibuat pada gambar yang mungkin dalam exitedkeadaan. Jadi, Anda perlu memastikan bahwa Anda telah menghentikan dan menghapus semua wadah yang dibuat pada gambar-gambar itu. Perintah berikut membantu Anda dalam menghapus semua kontainer yang tidak berjalan:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

Sekarang ini menghapus semua gambar non-perantara menjuntai <none>:

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

Catatan: Untuk menghentikan semua wadah yang berjalan:

docker stop `docker ps -q`
Eldo
sumber
1
Terima kasih untuk ini, saya menemukan ini sebagai implementasi terbersih.
Joseph Sawyer
7
Hati-hati jika Anda memiliki wadah volume data karena memiliki "status = keluar". Ini berarti Anda akan kehilangan semua data Anda.
Johan
19

Gambar saat ini dapat digunakan oleh wadah yang sedang berjalan, jadi Anda harus berhenti dulu dan mengeluarkannya.

docker stop <container-name>
docker rm <container-id>

Kemudian Anda dapat mencoba menghapus gambar:

docker rmi <image-id>

Anda harus yakin bahwa gambar ini tidak bergantung pada gambar lain (jika tidak Anda harus menghapusnya terlebih dahulu).

Saya memiliki kasus aneh di mana saya tidak memiliki lagi wadah yang masih hidup ( docker ps -atidak menghasilkan apa-apa) tetapi saya tidak dapat menghapus gambar dan ketergantungan gambarnya.

Untuk mengatasi kasus khusus ini, Anda dapat memaksa penghapusan gambar dengan ini:

docker rmi -f <image-id>
madx
sumber
19

Di Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

Ini akan menghapus semua gambar dengan nama "<none>". Saya menemukan gambar-gambar itu berlebihan.

marcell
sumber
3
Ini tidak menjawab pertanyaan, tetapi masih sangat bermanfaat. Terima kasih.
binwiederhier
5
buat perintah ini sederhana docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, mungkin perlu sudoizin
Larry Cai
15

Saya menemukan jawabannya dalam perintah ini:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

Saya punya masalah ketika saya menghapus beberapa gambar yang sedang digunakan, dan saya tidak menyadari (menggunakan docker ps -a).

ivangoblin
sumber
9

Sejak Docker ver. 1.13.0 (Januari 2017) ada system pruneperintah:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage
alexyz78
sumber
7

Selain jawaban Sunny:

Untuk menghapus semua gambar pada mesin Windows (dengan Docker untuk Windows) di jendela PowerShell, lakukan:

docker images -q | %{docker rmi -f $_}

Untuk menghapus semua kontainer pada mesin Windows (dengan Docker untuk Windows) di jendela PowerShell, lakukan:

docker ps -a -q | %{docker rm -f $_}
Paul Vogel
sumber
6

Pertama, lepaskan semua wadah menggunakan perintah berikut

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

Kemudian, hapus gambar dengan ID-nya menggunakan perintah berikut

sudo docker rmi <image-id>
Muheed
sumber
Perlu dicatat jika ini tidak jelas bagi sebagian orang bahwa ini akan menghapus semua wadah Docker yang sedang berjalan.
Michael Mior
4

Anda harus menghentikan / menghapus semua wadah yang tidak perlu yang dibuat pada gambar itu terlebih dahulu.

Lihat: Bagaimana menghapus wadah Docker tua .

Setelah itu gunakan solusi @marcell.

tgrigoryan
sumber
4

Hapus semua wadah

docker ps -q -a | xargs docker rm

Hapus paksa semua gambar Docker

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

Cukup Anda dapat menambahkan --forcedi akhir perintah. Suka:

sudo docker rmi <docker_image_id> --force

Untuk membuatnya lebih cerdas, Anda dapat menambahkan:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

Di sini, dalam docker ps$ 1 adalah kolom pertama, yaitu ID wadah Docker.

Dan docker images$ 3 adalah kolom ketiga, yaitu ID gambar Docker.

kushalbhattad
sumber
3

Versi paling ringkas dari perintah untuk menghapus semua gambar yang tidak ditandai adalah:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')
merah
sumber
3

Untuk menghapus beberapa gambar Docker Anda harus menjalankan perintah berikut:

$ docker rmi <docker_image_id>

Jadi, untuk menghapus semua gambar Docker, Anda dapat menjalankan perintah berikut:

$ docker rmi $(docker images -q)

Sekarang, jika Anda ingin menghapus semua gambar Docker (termasuk gambar yang sedang digunakan), Anda dapat menambahkan bendera -f, misalnya:

$ docker rmi -f $(docker images -q)
José David García Rodríguez
sumber
3

Menggunakan

docker image prune -all

atau

docker image prune -a

Hapus semua gambar yang menggantung. Jika -aditentukan, itu juga akan menghapus semua gambar yang tidak dirujuk oleh wadah apa pun.

Catatan: Anda akan diminta konfirmasi sebelum prune menghapus apa pun, tetapi Anda tidak diperlihatkan daftar apa yang berpotensi dihapus. Selain itu, docker image lstidak mendukung pemfilteran negatif, sehingga sulit untuk memprediksi gambar apa yang akan dihapus.

Sebagaimana dinyatakan dalam dokumentasi Docker untuk prune .

Dylan
sumber
1

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 Docker meltwater/docker-cleanup.

Dengan begitu Anda tidak perlu membersihkannya dengan tangan.

Lari saja:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Ini akan berjalan setiap 30 menit (atau berapa lama Anda mengaturnya menggunakan opsi DELAY_TIME = 1800) dan membersihkan wadah dan gambar yang keluar.

Lebih detail: https://github.com/meltwater/docker-cleanup/blob/master/README.md

Anigbo yang tidak bersalah
sumber