Update Sept. 2016: Docker 1.13: PR 26108 und Commit 86de7c0 führen einige neue Befehle ein, um die Visualisierung des Speicherplatzes der Docker-Daemon-Daten auf der Festplatte zu vereinfachen und das "Bereinigen" nicht benötigter "Überschüsse zu vereinfachen.
docker system prune
löscht ALLE baumelnden Daten (dh In der Reihenfolge: Container gestoppt, Volumes ohne Container und Bilder ohne Container). Auch unbenutzte Daten mit -a
Option.
Sie haben auch:
Für nicht verwendete Bilder, Verwendung docker image prune -a
(für baumelnden Entfernen und ununsed Bilder).
Warnung: " nicht verwendet " bedeutet "Bilder, auf die von keinem Container verwiesen wird": Seien Sie vorsichtig, bevor Sie sie verwenden -a
.
Wie in der Antwort von AL dargestellt , werden alle nicht verwendeten Bilder entfernt, nicht nur baumelnde ... was etwas zu viel sein kann.docker system prune --all
Die Kombination docker xxx prune
mit der --filter
Option kann eine gute Möglichkeit sein, das Bereinigen einzuschränken ( Docker SDK API 1.28 Minimum, also Docker 17.04+ ).
Die derzeit unterstützten Filter sind:
until (<timestamp>)
- Entfernen Sie nur Container, Bilder und Netzwerke, die vor dem angegebenen Zeitstempel erstellt wurden
label
( label=<key>
, label=<key>=<value>
, label!=<key>
, Oder label!=<key>=<value>
) - nur entfernen , Container, Bilder, Netzwerke und Volumen mit (oder ohne , falls label!=...
verwendet) die angegebenen Etiketten.
Ein Beispiel finden Sie unter " Bilder beschneiden ".
Ursprüngliche Antwort (Sep. 2016)
Normalerweise mache ich:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
Ich habe einen Alias zum Entfernen dieser [baumelnden Bilder] 13 :drmi
Der dangling=true
Filter findet nicht verwendete Bilder
Auf diese Weise wird jedes Zwischenbild entfernt, auf das nicht mehr durch ein beschriftetes Bild verwiesen wird.
Ich mache das gleiche zuerst für verlassene Prozesse (Container)
alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
Wie haridsv weist darauf hin , in den Kommentaren :
Technisch gesehen sollten Sie zuerst Container bereinigen, bevor Sie Bilder bereinigen, da dadurch mehr baumelnde Bilder und weniger Fehler erfasst werden .
Jess Frazelle (jfrazelle) hat die bashrc-Funktion :
dcleanup(){
docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}
Um alte Bilder und nicht nur "nicht referenzierte" baumelnde Bilder zu entfernen, können Sie Folgendes berücksichtigen docker-gc
:
Ein einfaches Docker-Container- und Image-Garbage-Collection-Skript.
- Container, die vor mehr als einer Stunde beendet wurden, werden entfernt.
- Bilder, die danach nicht mehr zu einem verbleibenden Container gehören, werden entfernt.
"dangling=true"
wirklich bedeutet?dcleanup
ist großartig!docker system prune
viel mehr als nur Bilder. Stellen Sie sicher,docker image prune
stattdessen zu verwenden . Und seien Sie sehr vorsichtig mit-a
: adocker system prune -a
kann verheerende Auswirkungen haben (auch das Entfernen von Volumes). Schließlich ja,-a
entfernt nicht verwendete Bilder, ich werde die Antwort bearbeiten.Aktualisieren Sie die zweite (2017-07-08):
Beziehen Sie sich (erneut) auf VonC, indem Sie das noch neuere verwenden
system prune
. Der Ungeduldige kann die Eingabeaufforderung mit der folgenden-f, --force
Option überspringen :Der Ungeduldige und Rücksichtslose kann zusätzlich "unbenutzte Bilder nicht nur die baumelnden" mit der
-a, --all
Option entfernen :https://docs.docker.com/engine/reference/commandline/system_prune/
Aktualisieren:
Lesen Sie die Antwort von VonC, in der die kürzlich hinzugefügten
prune
Befehle verwendet werden. Hier ist der entsprechende Shell-Alias:Alte Antwort:
Gestoppte (verlassene) Container löschen:
Nicht verwendete (baumelnde) Bilder löschen:
Wenn Sie in Bezug auf unwiderruflichen Datenverlust äußerste Vorsicht walten lassen, können Sie nicht verwendete (baumelnde) Volumes (Version 1.1 und höher) löschen:
Hier befinden sie sich in einem praktischen Shell-Alias:
Verweise:
docker ps -f
docker rm
docker images -f
docker rmi
docker volume ls
docker volume rm
quelle
docker volume rm
Rezept eine strenge Warnung hinzugefügt . Ich freue mich über Ihre Vorschläge.docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rm
funktioniert, solange Sie Ihre Volumes niemals mit etwas ähnlichem wie einem Guid benennen. Ich kann dies für die neue Filtersyntax optimieren.So entfernen Sie alte Bilder mit Tags , die älter als ein Monat sind:
Beachten Sie, dass es wird scheitern Bilder zu entfernen , die von einem Behälter verwendet werden, in einem Repository referenziert, hat unterhaltsberechtigte Kind Bilder ... was wahrscheinlich ist , was Sie wollen. Andernfalls fügen Sie einfach die
-f
Flagge hinzu.Beispiel eines
/etc/cron.daily/docker-gc
Skripts:quelle
.CreatedSince
verwendet Wochen als Zeiteinheit in der Ausgabe, selbst bei Bildern, die viele Wochen alt sind, z12 weeks
.docker images | grep ' months' | awk '{ print $3 }' | xargs --no-run-if-empty docker rmi -f
Die anderen Antworten sind großartig, insbesondere:
Aber ich brauchte etwas in der Mitte der beiden Befehle, also war die
filter
Option genau das, was ich brauchte:Ich hoffe, das hilft :)
Als Referenz: https://docs.docker.com/config/pruning/#prune-images
quelle
Angenommen, Sie haben Docker 1.13 oder höher, können Sie einfach die Bereinigungsbefehle verwenden. Für Ihre Frage speziell zum Entfernen alter Bilder möchten Sie das erste.
Ich würde empfehlen, sich nicht an den
docker system prune
Befehl zu gewöhnen . Ich gehe davon aus, dass Benutzer versehentlich Dinge entfernen, die sie nicht wollen. Persönlich werde ich hauptsächlich die Befehledocker image prune
und verwendendocker container prune
.quelle
docker system prune
nur die einzelnen Pflaumen zu verwenden.Bis jetzt (Docker Version 1.12) verwenden wir den folgenden Befehl, um alle laufenden Container zu löschen. Wenn wir die Volumes löschen möchten, können wir dies auch manuell mit dem entsprechenden Tag -v im folgenden Befehl tun.
Löschen Sie alle verlassenen Container
Löschen Sie alle gestoppten Container
Löschen Sie alle laufenden und gestoppten Container
Entfernen Sie alle Behälter ohne Kriterien
In Version 1.13 und höher können wir jedoch für eine vollständige System- und Bereinigung den folgenden Befehl direkt verwenden:
Alle nicht verwendeten Container, Bilder, Netzwerke und Volumes werden gelöscht. Wir können dies auch mit den folgenden Befehlen tun, die die einzelnen Komponenten bereinigen:
quelle
Das hat bei mir funktioniert:
quelle
Mit dem folgenden Befehl werden Bilder gelöscht, die älter als 48 Stunden sind.
quelle
docker image ls --all --filter reference=monolito --filter before=monolito:0.1.8
aufgelistet werden. Anschließend können Sie zum Löschen einen Befehl rmi anwenden.docker rmi $(docker image ls -q --all --filter reference=monolito --filter before=monolito:0.1.8)
Ich habe kürzlich ein Skript geschrieben, um dies auf einem meiner Server zu lösen:
quelle
Hier ist ein Skript zum Bereinigen von Docker-Images und zum Wiederherstellen des Speicherplatzes.
Originalschrift
https://github.com/vishalvsh1/docker-image-cleanup
Normalerweise speichert Docker alle temporären Dateien, die sich auf das Erstellen von Bildern und Ebenen beziehen, unter
/ var / lib / docker
Dieser Pfad ist lokal für das System, normalerweise auf der Root-Partition "/" .
Sie können einen größeren Speicherplatz bereitstellen und den Inhalt
/var/lib/docker
an den neuen Speicherort verschieben und einen symbolischen Link erstellen.Selbst wenn Docker-Images Speicherplatz belegen, hat dies keine Auswirkungen auf Ihr System, da es einen anderen Mount-Speicherort verwendet.
Ursprünglicher Beitrag: Verwalten von Docker-Images auf der lokalen Festplatte
quelle
Ich benutze diesen Befehl:
Dadurch werden alle Bilder entfernt, deren Erstellungszeit länger als 10 Wochen ist.
quelle
IMAGE_CTIME
undBEFORE_DATETIME
in diesemecho
BefehlWenn Sie Bilder entfernen möchten, die vor X Monaten gezogen wurden, können Sie das folgende Beispiel ausprobieren, in dem vor drei Monaten erstellte Bilder entfernt werden:
quelle
Zum Beschneiden aller Bilder und Volumes
docker system prune -af --volumes
quelle
docker system prune -a
(Sie werden aufgefordert, den Befehl zu bestätigen. Verwenden Sie diese Option, um die
-f
Ausführung zu erzwingen, wenn Sie wissen, was Sie tun.)quelle
docker system prune
Entfernen auch benannter Volumes mit-a
.@VonC hat bereits eine sehr nette Antwort gegeben, aber der Vollständigkeit halber hier ein kleines Skript, das ich verwendet habe --- und das auch alle Docker-Prozesse erledigt, falls Sie welche haben:
quelle
Error response from daemon: You cannot remove a running container
.docker kill $(docker ps -q)
Vor Zeile 3 zur Adresse hinzugefügt$(docker images -q)
statt verwenden$(docker images | awk '/<none>/ { print $3 }')
?docker images -q
bekomme ich einen Vektor von Bild-IDs, sonst nichts. Wenn ich das tue, was ich tue, bekomme ich mehr - so kann ich wie hier filtern<none>
. Macht Sinn?Um markierte Bilder zu entfernen, auf denen kein Container ausgeführt wird, müssen Sie ein kleines Skript verwenden:
quelle
Alte Behälter vor Wochen entfernen.
docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')
Alte Bilder vor Wochen entfernen. Achtung. Dadurch werden Basisbilder entfernt, die vor Wochen erstellt wurden, aber möglicherweise von Ihren neuen Bildern verwendet werden.
docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')
quelle
So entfernen Sie ein getaggtes Bild
Docker rmi das Tag zuerst
Docker rmi das Bild.
# Dies kann in einem Docker-Rmi-Aufruf erfolgen, z. B.: # Docker-Rmi <Repo: Tag> <Bild-ID>
(Dies funktioniert im November 2016, Docker Version 1.12.2)
z.B
zB Skript entfernt alles, was älter als 2 Wochen ist.
quelle
-f Kraft
-a alle
-q im Modus
quelle
oder
quelle
Gelegentlich sind Probleme aufgetreten, bei denen Docker Speicherplatz zuweist und weiterhin verwendet, auch wenn der Speicherplatz keinem bestimmten Image oder vorhandenen Container zugewiesen ist. Die letzte Art, wie ich dieses Problem versehentlich generiert habe, war die Verwendung von "Docker-Engine" -Centos anstelle von "Docker" in RHEL 7.1. Was zu passieren scheint, ist manchmal, dass die Containerbereinigungen nicht erfolgreich abgeschlossen werden und der Speicherplatz dann nie wieder verwendet wird. Als das 80-GB-Laufwerk, das ich als / zugewiesen hatte, mit / var / lib / docker-Dateien gefüllt war, musste ich einen kreativen Weg finden, um das Problem zu beheben.
Folgendes habe ich mir ausgedacht. Beheben Sie zuerst den Fehler "Festplatte voll":
Zu diesem Zeitpunkt hatte ich keinen Fehler mehr auf der Festplatte, aber ich verschwendete immer noch viel Speicherplatz. Die nächsten Schritte sind, sich darum zu kümmern.
Docker starten: systemctl start docker
Speichern Sie alle Bilder: Docker speichern $ (Docker-Bilder | sed -e '/ ^ / d' -e '/ ^ REPOSITORY / d' -e 's, [] [] ,:,' -e 's, [ ]. ,, ')> /root/docker.img
Docker deinstallieren.
Löschen Sie alles in / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *
Installieren Sie den Docker neu
Docker aktivieren: systemctl Docker aktivieren
Docker starten: systemctl Docker starten
Bilder wiederherstellen: Docker laden </root/docker.img
Starten Sie alle persistenten Container, die Sie ausführen müssen.
Dadurch wurde meine Festplattennutzung von 67 GB für Docker auf 6 GB für Docker gesenkt.
Ich empfehle dies nicht für den täglichen Gebrauch. Es ist jedoch nützlich, es auszuführen, wenn Docker aufgrund von Softwarefehlern oder unerwarteten Neustarts den Überblick über den verwendeten Speicherplatz verloren hat.
quelle
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 Image herunterladen
meltwater/docker-cleanup
.Renn einfach:
Es wird standardmäßig alle 30 Minuten ausgeführt. Sie können die Verzögerungszeit jedoch mithilfe dieses Flags in Sekunden einstellen (Option DELAY_TIME = 1800).
Weitere Details: https://github.com/meltwater/docker-cleanup/blob/master/README.md
quelle
Wenn Sie diese beschnittenen Bilder selbst erstellen (von einigen anderen, älteren Basisbildern), gehen Sie bitte vorsichtig mit den oben akzeptierten Lösungen um
docker image prune
, da der Befehl stumpf ist und versucht, auch alle Abhängigkeiten zu entfernen, die für Ihre neuesten Bilder erforderlich sind (der Befehl sollte es sein) wahrscheinlich umbenannt indocker image*s* prune
).Die Lösung, die ich für meine Docker-Image-Build-Pipelines gefunden habe (wo es tägliche Builds gibt und Tags = Datumsangaben im
YYYYMMDD
Format vorliegen), lautet wie folgt:quelle
Es gibt Sparrow Plugin Docker-Remove-Dangling-Bilder, mit denen Sie gestoppte Container und nicht verwendete (baumelnde) Bilder bereinigen können:
$ sparrow plg run docker-remove-dangling-images
Es funktioniert sowohl für Linux als auch für Windows.
quelle
Führen Sie
docker images
zunächst eine Liste der Bilder aus und kopieren Sie die IMAGE HASH ID in die Zwischenablage.Lauf
docker rmi -f <Image>
Denken Sie daran, dass die Option
-f
das Löschen erzwingen ist.quelle