Wie kann ich Docker-Bilder löschen?

265

Ich habe die folgenden Bilder:

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

und wenn ich versuche, einen von ihnen zu entfernen, bekomme ich:

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

Wie kann ich sie entfernen? Warum gibt es solche Konflikte?

alexyz78
quelle

Antworten:

478

Verwenden Sie den angegebenen Befehl, um alle Bilder zu löschen

docker rmi $(docker images -q)

Verwenden Sie den angegebenen Befehl, um alle Container zu löschen

docker rm $(docker ps -a -q)

Warnung: Dadurch werden alle Ihre Bilder und Container zerstört. Es wird nicht möglich sein, sie wiederherzustellen!

Diese Lösung wird von Techoverflow.net bereitgestellt .

Sonnig
quelle
17
Einfach und gerade. Auch Sie unten Befehl, um das Entfernen von Bildern zu erzwingen. 'docker rmi -f $ (docker images -q)'
dimuthu
37
Das Windows Powershell-Äquivalent istdocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot
1
Zuerst habe ich das cmd auf @muheed How to Answer ( stackoverflow.com/a/30475249/2747020 ) verwendet, um das Entfernen einiger Bilder freizuschalten:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar
1
Windows Powershell für Docker-Containerdocker ps -a -q | %{docker rm -f $_}
Dexter
1
Wie @ alexyz78 unten bemerkt, können Sie jetzt verwenden docker system prune. Also, um alles abzuwischen: Um docker kill $(docker ps -q)Container zu stoppen, gefolgt von einem, docker system prune -awird alles entfernt - siehe stackoverflow.com/a/44309011/247708
Bharat
101

Möglicher Grund: Der Grund kann sein, dass dieses Image derzeit von einem laufenden Container verwendet wird. In diesem Fall können Sie laufende Container auflisten, den entsprechenden Container stoppen und dann das Image entfernen:

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

Wenn Sie den Container von Docker ps nicht finden können, können Sie damit alle bereits verlassenen Container auflisten und entfernen.

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

Hinweis: Achten Sie darauf, alle verlassenen Container auf einmal zu löschen, falls Sie Volume-OnlyContainer verwenden. Diese bleiben im ExitZustand, enthalten aber nützliche Daten .

Jiri
quelle
Tatsächlich würden Sie eine Nachricht erhalten, die dies angibt. Vielleicht basiert ein anderes Bild auf diesem? Entfernen Sie zuerst alle Bilder, die Sie aus diesem Bild erstellt haben.
Qkrijger
12
Ich konnte das Bild mit sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(dank github.com/dotcloud/docker/issues/3258 ) und dann mitsudo docker rmi 70c0e19168cf
alexyz78
2
Achten Sie darauf, Bilder im ExitStatus zu löschen . Wenn Sie nur Container mit Datenvolumen verwenden, werden diese nicht weiter ausgeführt.
Aceofspades
1
awk kann grep:awk '/Exit/ {print $1}'
Dwight Spencer
Ihre Befehle werfen dies Error response from daemon: No such container: .... Es ist schwer zu sagen, was ersetzt werden muss und durch was ich ersetzen soll. Nicht benutzen...
Felo Vilches
60

Der Grund für den Fehler ist, dass, obwohl das Bild kein Tag hatte, immer noch ein Container auf diesem Bild erstellt wurde, der sich möglicherweise im exitedStatus befindet. Sie müssen also sicherstellen, dass Sie alle auf diesen Bildern erstellten Container angehalten und gelöscht haben. Der folgende Befehl hilft Ihnen beim Entfernen aller Container, die nicht ausgeführt werden:

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

Dies entfernt nun alle baumelnden Nicht-Zwischenbilder <none>:

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

Hinweis: So stoppen Sie alle laufenden Container:

docker stop `docker ps -q`
Eldos
quelle
1
Vielen Dank dafür. Ich fand, dass dies die sauberste Implementierung ist.
Joseph Sawyer
7
Seien Sie vorsichtig, wenn Sie Datenvolumencontainer haben, da diese "status = beendet" haben. Dies bedeutet, dass Sie alle Ihre Daten verlieren.
Johan
19

Das Bild kann derzeit von einem laufenden Container verwendet werden. Sie müssen also zuerst die Container anhalten und entfernen.

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

Dann könnten Sie versuchen, das Bild zu löschen:

docker rmi <image-id>

Sie müssen sicher sein, dass dieses Bild nicht von anderen Bildern abhängt (andernfalls müssen Sie sie zuerst löschen).

Ich hatte einen seltsamen Fall, in dem ich keine Container mehr am Leben hatte ( docker ps -anichts zurückgegeben), aber ich konnte das Bild und seine Bildabhängigkeit nicht löschen.

Um diese Sonderfälle zu lösen, können Sie die Bildentfernung folgendermaßen erzwingen:

docker rmi -f <image-id>
Madx
quelle
19

In Bash:

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

Dadurch werden alle Bilder mit dem Namen "<keine>" entfernt. Ich fand diese Bilder überflüssig.

marcell
quelle
3
Dies beantwortet die Frage nicht, ist aber dennoch sehr nützlich. Vielen Dank.
Binwiederhier
5
Machen Sie diesen Befehl einfach docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, es kann eine sudoErlaubnis erfordern
Larry Cai
15

Ich habe die Antwort in diesem Befehl gefunden:

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

Ich hatte Ihr Problem, als ich einige Bilder löschte, die verwendet wurden, und ich habe es nicht bemerkt (mit docker ps -a).

Ivangoblin
quelle
9

Seit Docker ver. 1.13.0 (Januar 2017) gibt es den system pruneBefehl:

$ 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
quelle
7

Zusätzlich zu Sunnys Antwort:

Gehen Sie folgendermaßen vor, um alle Bilder auf einem Windows-Computer (mit Docker für Windows) in einem PowerShell-Fenster zu löschen :

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

Gehen Sie folgendermaßen vor, um alle Container auf einem Windows-Computer (mit Docker für Windows) in einem PowerShell-Fenster zu löschen :

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

Entfernen Sie zunächst alle Container mit dem folgenden Befehl

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

Entfernen Sie dann das Bild anhand seiner ID mit dem folgenden Befehl

sudo docker rmi <image-id>
Muheed
quelle
Es ist erwähnenswert, falls dies für einige nicht offensichtlich ist, dass dadurch alle laufenden Docker-Container entfernt werden.
Michael Mior
4

Sie müssen zuerst alle unnötigen Container stoppen / löschen, die auf diesen Bildern erstellt wurden.

Schauen Sie sich an: So entfernen Sie alte Docker-Container .

Verwenden Sie danach die @ marcell-Lösung.

tgrigoryan
quelle
4

Entfernen Sie alle Behälter

docker ps -q -a | xargs docker rm

Erzwingen Sie das Entfernen aller Docker-Images

docker rmi -f $(docker images -f dangling=true -q)
Alles ist gut
quelle
4

Sie können einfach --forceam Ende des Befehls hinzufügen . Mögen:

sudo docker rmi <docker_image_id> --force

Um es intelligenter zu machen, können Sie Folgendes hinzufügen:

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

Hier in docker ps$ 1 befindet sich die erste Spalte, dh die Docker-Container-ID.

Und docker images$ 3 ist die dritte Spalte, dh die Docker-Image-ID.

kushalbhattad
quelle
3

Die kompakteste Version eines Befehls zum Entfernen aller Bilder ohne Tags ist:

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

Um ein Docker-Image zu löschen, müssen Sie den folgenden Befehl ausführen:

$ docker rmi <docker_image_id>

Um alle Docker-Images zu löschen, können Sie den folgenden Befehl ausführen:

$ docker rmi $(docker images -q)

Wenn Sie nun alle Docker-Bilder löschen möchten (einschließlich der verwendeten Bilder), können Sie das Flag hinzufügen -f, zum Beispiel:

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

Verwenden

docker image prune -all

oder

docker image prune -a

Entfernen Sie alle baumelnden Bilder. Wenn -aangegeben, werden auch alle Bilder entfernt, auf die von keinem Container verwiesen wird.

Hinweis: Sie werden zur Bestätigung aufgefordert, bevor die Bereinigung etwas entfernt. Es wird jedoch keine Liste der möglicherweise entfernten Elemente angezeigt. Zusätzlich,docker image ls die Negativfilterung nicht unterstützt, sodass es schwierig ist, vorherzusagen, welche Bilder tatsächlich entfernt werden.

Wie in der Docker-Dokumentation zum Beschneiden angegeben .

Dylan
quelle
1

Wenn Sie verlassene Container automatisch / regelmäßig bereinigen und Images und Volumes entfernen möchten, die nicht von einem laufenden Container verwendet werden, können Sie das Docker-Image herunterladen meltwater/docker-cleanup.

Auf diese Weise müssen Sie es nicht von Hand aufräumen.

Renn einfach:

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

Es wird alle 30 Minuten ausgeführt (oder wie lange Sie es mit der Option DELAY_TIME = 1800 einstellen) und bereinigte Container und Bilder bereinigen.

Weitere Details: https://github.com/meltwater/docker-cleanup/blob/master/README.md

Unschuldiger Anigbo
quelle