Bagaimana cara menghapus gambar di Docker?

840

Saya menjalankan Docker di bawah Vagrant di bawah OS X 10.8.4 (Mountain Lion), dan setiap kali saya mencoba menghapus gambar yang disimpan, saya mendapatkan kesalahan:

$ docker rmi some-image-id
2013/07/15 hh:mm:ss unexpected JSON input

Menurut rmibantuan itu, sintaks yang tepat adalah docker rmi IMAGE [IMAGE...], dan saya tidak yakin apa yang harus saya lakukan.

Bagaimana saya bisa menghapus gambar?

$ docker version
Client version: 0.4.8
Server version: 0.4.8
Go version: go1.1

 

$docker info
Containers: 1
Images: 3

Menariknya, ketika saya berlari docker ps, tidak ada wadah yang muncul sama sekali. Running docker imagesmenunjukkan empat (4) basegambar dan satu (1) nodegambar.

Jules
sumber
1
Apa versi buruh pelabuhan yang Anda gunakan? Bisakah Anda menempelkan output 'versi buruh pelabuhan' dan 'info buruh pelabuhan'? Saya baru saja mencoba dengan master dan itu bekerja dengan baik.
Creack
Saya telah memperbarui pertanyaan dengan info itu.
Jules
1
docker infomenunjukkan jumlah gambar yang sebenarnya, Anda dapat mencoba ./docker images -a -q | sort | uniq | wc -lhasilnya harus sama (-a untuk semua gambar, -q hanya untuk id). docker pshanya menunjukkan wadah aktif, yang dapat Anda lakukan docker ps -auntuk mendaftar semua wadah
creack
Bisakah Anda mencoba memulai docker daemon dengan -Dopsi dan klien juga? docker -d -D& ; docker -D rmi <id>. Bisakah kamu juga mencoba CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $ID?
Creack
4
Lihatlah permintaan penarikan ini: github.com/dotcloud/docker/pull/1225
creack

Jawaban:

1013

Coba docker rmi node. Itu seharusnya bekerja.

Melihat semua wadah yang dibuat sesederhana docker ps -a.

Untuk menghapus semua wadah yang ada (bukan gambar!) Jalankan docker rm $(docker ps -aq)

Nick Stinemates
sumber
13
Jika beberapa kontainer Anda masih berjalan, Anda bisa menjalankan: buruh pelabuhan berhenti $ (buruh pelabuhan ps -qa) untuk menghentikan semua wadah. Saya pikir menghapus wadah yang berjalan mungkin tidak berhasil, setidaknya saya ingat saya punya masalah dengan ini. Saya mungkin salah dia ... Saya telah memeriksa halaman manual dan mendukung hipotesis saya: "-f, --force = true | false Force penghapusan wadah yang sedang berjalan. Defaultnya salah."
Konrad Kleine
1
Ah, saya tidak tahu tentang perintah untuk "menghapus semua wadah yang ada". Sudah menulis sendiri: buruh pelabuhan ps -a | sed -r 's / ^ (\ w +). * / \ 1 / g' | sed -r / ^ CONTAINER // '| sed -r 's / ^ (\ w +) / docker rm \ 1 / g' | sistem awk ($ 0) 'Terima kasih!
Anurag
4
Anda tahu opsi baris perintah dirancang dengan buruk ketika Anda perlu menggunakan fitur spesifik shell untuk mencapai fungsionalitas dasar.
user3467349
Untuk menghapus semua gambar yang ada, Anda dapat menggunakan - "buruh pelabuhan rmi $ (buruh pelabuhan gambar -q)"
manusia
Untuk menghapus semua kontainer yang ada menggunakan Windows PowerShell: docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; }
fartwhif
565

Berikut ini adalah beberapa cara untuk menghapus gambar / kontainer buruh pelabuhan:

Hapus satu gambar

docker rmi image_name:version/image-id

Hapus semua gambar

docker rmi $(docker images -qf "dangling=true")

Bunuh kontainer dan keluarkan:

docker rm $(docker kill $(docker ps -aq))

Catatan: Ganti killdengan stopuntuk shutdown yang anggun

Hapus semua gambar kecuali "gambar saya"

Gunakan grep untuk menghapus semua kecuali my-imagedanubuntu

docker rmi $(docker images | grep -v 'ubuntu\|my-image' | awk {'print $3'})

Atau (tanpa awk)

docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))

Ulises
sumber
25
Tambahan: hapus gambar "menggantung" (gambar tanpa tag):docker rmi $(docker images -qf "dangling=true")
kolypto
5
Harusnyadocker rm $(docker kill $(docker ps -a -q))
BMW
1
"Hapus semua kecuali" tanpa awk:docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))
phobie
1
@kolypto "Dangling = true" tampaknya tidak menghapus wadah yang tidak menggantung. Jalankan lagi, minus tanda -f dan menggantung untuk menghapus sisanya.
DougW
1
Apakah hanya saya, atau apakah saran terakhir (atau (tanpa awk)) tidak benar-benar berfungsi?
Mike Wise
196

Hapus semua kontainer buruh pelabuhan

docker rm $(docker ps -a -q)

Hapus semua gambar buruh pelabuhan

docker rmi $(docker images -q)
Kepompong
sumber
7
Hapus gambar yang tidak ditandai:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
Barrett Clark
1
eq8.eu/blogs/23-spring-cleaning-for-webdevelopers sudo docker rmi -f $(sudo docker images | grep "<none>" | awk "{print \$3}") dan kemudian menghapus tag rilis langsung tahun 2015 (mis. live-20150121223) yang bisa kita lakukan sudo docker rmi -f $(sudo docker images | grep live-2015 | awk "{print \$3}")
setara dengan
Untuk memaksanya, Anda harus menulis: docker -f rm $ (docker ps -a -q)
Adrian Lopez
71

Untuk menghapus gambar dari Docker menggunakan ID gambar:

  1. Dapatkan daftar semua Gambar

    docker images
    
  2. Identifikasi ID gambar dari gambar yang ingin Anda hapus, misalnya:

    REPOSITORY     TAG     IMAGE ID        CREATED        VIRTUAL SIZE
    kweku360/java  latest  08d3a9b8e166    2 weeks ago         5.733 GB`
    
  3. Terakhir hapus gambar menggunakan ID gambar (hanya tiga digit pertama yang diperlukan)

    docker rmi 08d
    
kweku360
sumber
1
Yang pertama perlu menghentikan wadah dan mengeluarkannya, lihat stackoverflow.com/questions/21398087/…
vikramvi
37

Gambar:

  1. Daftar gambar

    gambar buruh pelabuhan

  2. Hapus satu gambar

    buruh pelabuhan rmi image_name

  3. Hapus paksa satu gambar

    docker rmi -f image_name

Wadah:

  1. Daftar semua wadah

    buruh pelabuhan ps -a

  2. Hapus satu wadah

    buruh pelabuhan rm container_id

  3. Hapus paksa satu wadah

    buruh pelabuhan r -f container_id

kode hackfox
sumber
29

Perbarui, seperti yang dikomentari oleh VonC di Cara menghapus wadah Docker lama .

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

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
Terima kasih atas jawaban yang saksama, tetapi ini tidak langsung menjawab pertanyaan awal (yang sudah dijawab, dan jawaban teratas siapa yang masih relevan).
Jules
2
Saya setuju. Namun, karena judul pertanyaan ini sangat umum, ini menjadi semacam pertanyaan referensi, jadi saya pikir memberikan pembaruan pada mekanisme sudah ada.
qkrijger
24

Menghapus Kontainer

  1. Untuk menghapus wadah tertentu

    docker rm CONTAINER_ID CONTAINER_ID
    
    • Untuk gambar tunggal

      docker rm  70c0e19168cf
      
    • Untuk banyak gambar

      docker rm  70c0e19168cf c2ce80b62174
      
  2. Hapus wadah yang keluar

    docker ps -a -f status=exited
    
  3. Hapus semua wadah

    docker ps -q -a | xargs docker rm
    


Menghapus Gambar

docker rmi IMAGE_ID
  1. Hapus gambar tertentu

    • untuk gambar tunggal

      docker rmi ubuntu
      
    • untuk banyak gambar

      docker rmi ubuntu alpine
      
  2. Hapus gambar yang menggantung Gambar yang menggantung
    adalah lapisan yang tidak memiliki hubungan dengan gambar yang ditandai karena gambar Docker terdiri dari beberapa gambar.

    docker rmi -f $(docker images -f dangling=true -q)
    
  3. Hapus semua gambar Docker

    docker rmi -f $(docker images -a -q)
    

Menghapus Volume

Untuk daftar volume, jalankan docker volume ls

  1. Hapus volume tertentu

    docker volume rm VOLUME_NAME
    
  2. Hapus volume yang menggantung

    docker volume rm $(docker volume ls -f dangling=true -q)
    
  3. Hapus wadah dan volumenya

    docker rm -v CONTAINER_NAME
    
Semuanya
sumber
Mengapa ganda CONTAINER_ID?
Peter Mortensen
19

docker rm container_name

docker rmi image_name

docker help

rm Keluarkan satu atau lebih wadah

rmi Hapus satu atau lebih gambar

KunMing Xie
sumber
Terima kasih, tetapi pertanyaan ini sudah memiliki beberapa jawaban, dan jawaban yang dipilih, yang memecahkan masalah hampir 3 tahun yang lalu.
Jules
13
docker rmi  91c95931e552

Respons kesalahan dari daemon: Konflik, tidak dapat menghapus 91c95931e552 karena wadah 76068d66b290 menggunakannya, gunakan -f untuk memaksa FATA [0000] Kesalahan: gagal menghapus satu atau lebih gambar

Temukan ID kontainer,

# docker ps -a

# docker rm  daf644660736 
lakshmikandan
sumber
Apakah itu jawaban untuk pertanyaan itu?
Peter Mortensen
Mengapa daf644660736? Bagaimana itu terkait dengan yang sebelumnya?
Peter Mortensen
5

Pertama-tama, kita harus berhenti dan menghapus wadah Docker yang dilampirkan dengan gambar Docker yang akan kita hapus.

Jadi untuk itu, pertama

  • docker stop container-id - Untuk menghentikan wadah yang sedang berjalan
  • docker rm container-id - Untuk menghapus / menghapus wadah

kemudian,

  • docker rmi image-id - Untuk menghapus / menghapus gambar
Murali Manchadikkal
sumber
3

Untuk versi 1.13 dan lebih tinggi:

docker image rm [OPTIONS] IMAGE [IMAGE...]

Perbandingan:

yang [OPTIONS]tampaknya tidak memiliki perbedaan.

--force , -f        Force removal of the image
--no-prune          Do not delete untagged parents

Dari: Memperkenalkan Docker 1.13

CLI direstrukturisasi

Di Docker 1.13, kami mengelompokkan kembali setiap perintah untuk duduk di bawah objek logis yang berinteraksi dengannya. Sebagai contoh listdan startwadah sekarang sub- perintah docker containerdan historymerupakan sub-perintahdocker image .

Perubahan ini memungkinkan kami membersihkan sintaksis Docker CLI, meningkatkan teks bantuan, dan membuat Docker lebih mudah digunakan. Sintaks perintah lama masih didukung, tetapi kami mendorong semua orang untuk mengadopsi sintaks baru .

tgogo
sumber
3

Docker menyediakan beberapa perintah untuk dihapus images.

Tampilkan / Hapus Images:

docker images
docker images -a # All images
docker images --no-trunc # List the full length image IDs

docker images --filter "dangling=true" // Show unstage images
docker rmi $(docker images -f "dangling=true" -q) # Remove on unstages images

docker rmi <REPOSITORY> or <Image ID> # Remove a single image

docker image prune # Interactively remove dangling images
docker image prune -a # Remove all images

or 

docker rmi -f $(sudo docker images -a -q)

Selain itu, Anda juga dapat menggunakan filterparameter untuk menghapus set gambar sekaligus:

Contoh:

$docker images --filter "before=<hello-world>" // It will all images before hello-world

$docker images --filter "since=<hello-world>" // It will all images since hello-world

Jadi Anda dapat menghapus gambar filter seperti ini:

docker rmi $(docker images --filter "since=<hello-world>")
docker rmi $(docker images --filter "before=<hello-world>")
Tuan Singh
sumber
1

Hapus semuanya menggunakan

Langkah 1: Bunuh semua kontainer

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker kill $i ; done

Langkah 2: RM mereka terlebih dahulu

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker rm $i ; done

Langkah 3: Hapus gambar menggunakan paksa

for i in `sudo docker images | awk '{ print $3}'`; do  sudo docker rmi --force $i ; done

Gunakan langkah 1 jika Anda mendapatkan kesalahan dengan mengatakan itu tidak dapat dihapus karena ketergantungan anak

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

Saya menggunakan ini pada produksi karena kami menyebarkan beberapa kali sehari di beberapa server, dan saya tidak ingin pergi ke setiap server untuk membersihkan (itu akan merepotkan).

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
1

Berikut ini adalah skrip shell untuk menghapus gambar yang diberi tag (bernama) dan wadahnya. Simpan sebagai docker-rmi dan jalankan menggunakan 'docker-rmi my-image-name'

#!/bin/bash

IMAGE=$1

if [ "$IMAGE" == "" ] ; then
  echo "Missing image argument"
  exit 2
fi

docker ps -qa -f "ancestor=$IMAGE" | xargs docker rm
docker rmi $IMAGE
Alex M.
sumber
Anda harus xargs -rmembuatnya berfungsi dalam wadah yang tidak cocok.
sebagai.
0

Kenapa tidak ada yang menyebutkan docker-compose! Saya baru saja menggunakannya selama satu minggu, dan saya tidak bisa bertahan tanpanya. Yang Anda butuhkan hanyalah menulis yml yang hanya membutuhkan beberapa menit belajar, dan kemudian Anda siap untuk mulai. Itu dapat mem-boot gambar, wadah (yang diperlukan dalam layanan yang disebut) dan memungkinkan Anda meninjau log seperti yang Anda gunakan dengan perintah asli buruh pelabuhan. Cobalah:

docker-compose up -d
docker-compose down --rmi 'local'

Sebelum saya menggunakan docker-compose, saya menulis skrip shell saya sendiri, kemudian saya harus menyesuaikan skrip kapan pun diperlukan terutama ketika arsitektur aplikasi berubah. Sekarang saya tidak perlu melakukan ini lagi, berkat komposisi buruh pelabuhan.

Tiina
sumber
docker-composeadalah alat orkestrasi dan sering tidak praktis untuk digunakan dalam proyek sederhana. dockerSolusi mandiri (tidak memerlukan penggunaan docker-compose.ymlkonfigurasi yang sering kali sulit ) lebih disukai dalam konteks pertanyaan ini. Selain itu, sudah ada banyak, banyak jawaban bagus di sini.
Jules
@ Jules tidak ada yang menyebutkan docker-compose tidak berarti itu adalah jawaban yang buruk, dan tidak berarti ini juga merupakan jawaban yang tidak berdaya. Perintah asli Docker tidak buruk, tetapi membosankan dan membutuhkan cukup banyak mengetik setiap waktu. "Satu baik, dan dua terlalu banyak".
Tiina
-1

Bagi saya yang berikut ini berfungsi dengan baik:

> docker images
REPOSITORY   TAG           IMAGE ID          CREATED             SIZE
debian       jessie        86baf4e8cde9      3 weeks ago         123MB
ubuntu       yakkety       7d3f705d307c      3 weeks ago         107MB
alpine       3.5           074d602a59d7      7 weeks ago         3.99MB

Lalu, lanjutkan dan hapus gambar dengan menjalankan beberapa seperti ini:

> docker rmi debian:jessie
> docker rmi ubuntu:yakkety
> docker rmi alipine:3.5
Julisch
sumber
-1

Daftar gambar:

ahanjura@ubuntu:~$ sudo docker images

REPOSITORY TAG IMAGE ID CREATED SIZE 88282f8eda00 19 detik yang lalu 308.5 MB 13e5d3d682f4 19 jam yang lalu 663 MB busybox2 terbaru 05fe66bb1144 20 jam yang lalu 1.129 MB ubuntu 16.04 00fd29ccc661 5 hari yang lalu 110.5 MB ubuntu 14.050.780.780 sekarang busybox terbaru 6ad733544a63 6 minggu lalu 1.129 MB ubuntu 16.10 7d3f705d307c 5 bulan lalu 106.7 MB

Hapus gambar:

ahanjura@ubuntu:~$ sudo docker rmi 88282f8eda00

Dihapus: SHA256: 88282f8eda0036f85b5652c44d158308c6f86895ef1345dfa788318e6ba31194 Dihapus: SHA256: 4f211a991fb392cd794bc9ad8833149cd9400c5955958c4017b1e2dc415e25e9 Dihapus: SHA256: 8cc6917ac7f0dcb74969ae7958fe80b4a4ea7b3223fc888dfe1aef42f43df6f8 Dihapus: SHA256: b74a8932cff5e61c3fd2cc39de3c0989bdfd5c2e5f72b8f99f2807595f8ece43

ahanjura@ubuntu:~$ sudo docker rmi 13e5d3d682f4

Respons kesalahan dari daemon: konflik: tidak dapat menghapus 13e5d3d682f4 (harus dipaksakan) - gambar sedang digunakan oleh kontainer yang terhenti 5593e25eb638

Hapus dengan paksa:

ahanjura@ubuntu:~$ sudo docker rmi -f 13e5d3d682f4

Dihapus: SHA256: 13e5d3d682f4de973780b35a3393c46eb314ef3db45d3ae83baf2dd9d702747e Dihapus: SHA256: 3ad9381c7041c03768ccd855ec86caa6bc0244223f10b0465c4898bdb21dc378 Dihapus: SHA256: 5ccb917bce7bc8d3748eccf677d7b60dd101ed3e7fd2aedebd521735276606af Dihapus: SHA256: 18356d19b91f0abcc04496729c9a4c49e695dbfe3f0bb1c595f30a7d4d264ebf

pengguna1833058
sumber
-1

Dalam kasus saya masalahnya adalah bahwa saya memiliki gambar belakangnya dengan nama yang sama solusinya adalah dengan menambahkan tag setelah nama atau id

sudo docker rmi <NAME>:<TAG>

ex:

sudo docker rmi php:7.0.4-fpm
Amirouche Zeggagh
sumber