So entfernen Sie alte Docker-Container


1235

Diese Frage bezieht sich auf Sollte ich mir Sorgen über überschüssige, nicht laufende Docker-Container machen? .

Ich frage mich, wie ich alte Behälter entfernen soll. Mit docker rm 3e552code34akönnen Sie eine einzelne entfernen, aber ich habe bereits viele. docker rm --helpgibt keine Auswahloption an (wie alle oder nach Bildnamen).

Vielleicht gibt es ein Verzeichnis, in dem diese Container gespeichert sind, in dem ich sie einfach manuell löschen kann?


21
Sie sollten auch in Betracht ziehen, verwaiste Docker-Volumes zu bereinigen. Ich finde oft, dass sie viel mehr Platz verbrauchen als alte Container und alte Bilder. Ein gutes Skript zum Entfernen verwaister Docker-Volumes finden Sie unter: github.com/chadoe/docker-cleanup-volumes .
Nemanja Trifunovic

Vielleicht kann Ihnen github.com/chadoe/docker-cleanup-volumes helfen.
Mihai8

Sie können auch docker rundas --rmFlag verwenden, das den Container kurzlebig macht und alle Containerdateien nach dem Ausführen entfernt.
Gordon

12
Mit Docker 1.13 (Q4 2016) können Sie auch den neuen docker system pruneBefehl berücksichtigen . Siehe meine Antwort unten .
VonC

1
Verwenden Sie das Docker-Management-Tool. Portainer Wir können es all the old containers, non using volumes and imagesmit diesem Tool verwalten. Es ist eine einfache Verwaltungs-Benutzeroberfläche für Docker Please refer my update below on how to deploy the application
Anish Varghese

Antworten:


1460

Seit Docker 1.13.x können Sie Docker Container Prune verwenden :

docker container prune

Dadurch werden alle gestoppten Container entfernt und sollten auf allen Plattformen gleich funktionieren.

Es gibt auch eine Docker-Systembeschneidung :

docker system prune

Dadurch werden alle nicht verwendeten Container, Netzwerke, Bilder (sowohl baumelnd als auch nicht referenziert) und optional Volumes in einem Befehl bereinigt.


Bei älteren Docker-Versionen können Sie Docker-Befehle mit anderen Unix-Befehlen verknüpfen, um das zu erhalten, was Sie benötigen. Hier ist ein Beispiel zum Reinigen alter Behälter, die Wochen alt sind:

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

Dieses Beispiel stammt von https://twitter.com/jpetazzo/status/347431091415703552 .


92
Ähnlicher Befehl, um alle nicht getaggten Bilder zu entfernen: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj

7
@ MichelMüller Beim Erstellen eines Images aus einer Docker-Datei können Sie die -rmOption angeben , Zwischencontainer nach einem erfolgreichen Build zu entfernen.
Freek Kalter

3
@ MichelMüller Die Bilder werden zum Zwischenspeichern verwendet, so dass das Entfernen der Container dies nicht beeinflusst.
Ken Cochrane

7
Wenn Sie awk für diesen verwenden möchten, berücksichtigen Sie diesen Befehl, wenn Sie alle gestoppten Container docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
ausführen

3
Dies sollte der aktualisierte Befehl zum Entfernen von Bildern ohne docker rmi $(docker images -q -f dangling=true)
Tags sein

626

Eine andere Methode, die ich von Guillaume J. Charmes bekommen habe (Gutschrift, wo sie fällig ist):

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

entfernt alle Behälter auf elegante Weise.

Und von Bartosz Bilicki für Windows:

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

Für PowerShell:

docker rm @(docker ps -aq)

Ein Update mit Docker 1.13 (4. Quartal 2016), Dank an VonC ( später in diesem Thread ):

docker system prune löscht ALLE nicht verwendeten Daten (dh in der Reihenfolge: Container gestoppt, Volumes ohne Container und Bilder ohne Container).

Siehe PR 26108 und Commit 86de7c0 , in denen einige neue Befehle eingeführt werden, 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

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

11
Das funktioniert irgendwie nicht für mich, aber es docker ps -a -q | xargs docker rmfunktioniert (Sudo kann benötigt werden)
FUD

86
was ist mit docker rm $(docker ps -a -q)?
Qkrijger

8
@qkrijger, dies ändert nichts an Ihrer ursprünglichen Antwort, außer das Hinzufügen von Bashism. Das Problem ist ein Befehlszeilenüberlauf. Die xargs-Variante geht auf nette Weise damit um. Ich würde auch --no-trunk zu Docker ps hinzufügen, um (unwahrscheinliche) ID-Konflikte zu vermeiden.
Ihor Kaharlichenko

8
Seien

4
Ich verstehe den Punkt nicht mit, --no-truncda ich docker rmsowieso keine vollständigen IDs benötige.
Pithikos

411

Aktualisierte Antwort Verwenden Sie docker system pruneoder docker container prunejetzt. Siehe VonCs aktualisierte Antwort .

Vorherige Antwort Wenn Sie oben verschiedene Hinweise zusammenstellen, scheint die eleganteste Methode zum Entfernen aller nicht laufenden Container zu sein:

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

  • -q druckt nur die Container-IDs (ohne Spaltenüberschriften)
  • -f Mit dieser Option können Sie Ihre Liste der gedruckten Container filtern (in diesem Fall wird gefiltert, um nur verlassene Container anzuzeigen).

7
Dies sollte die richtige Antwort sein, da Docker Ihnen mitteilt, welche Container nicht mehr verwendet werden, anstatt davon auszugehen, dass sich das Textausgabeformat von $ (Docker-Bilder) nicht ändert. Bonuspunkte für das Laichen nur eines zusätzlichen Prozesses anstelle von zwei.
Eurythmie

18
Möglicherweise möchten Sie hinzufügen -v, um baumelnde Volumes zu vermeiden : docker rm -v $(docker ps -q -f status=exited). Weitere Informationen zu baumelnden Volumes finden Sie unter docs.docker.com/userguide/dockervolumes/… .
Rluba

@rluba Anscheinend wird es in Docker 1.9 eine separate Volume-API geben, um dieses Problem zu beheben. github.com/docker/docker/pull/14242
Ryan Walls

Ein Alias ​​könnte nützlich sein:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung

Im Gegensatz zu der als richtig gekennzeichneten Antwort funktioniert die Antwort von @RyanWalls unter OSX und ist präziser.
Ray

255

Der offizielle Weg ist:

docker rm `docker ps -aq`

Die Docker-Betreuer haben angegeben, dass hierfür kein Befehl vorhanden ist - und Sie setzen die folgenden Befehle zusammen:

Wir haben dies bereits besprochen und bevorzugen, dass Benutzer die obige Zeile verwenden, ohne Docker zusätzlichen Code hinzufügen zu müssen.


6
Dies ist jedoch eine schlechte Lösung, da dadurch auch Speichercontainer gelöscht werden.
Sobrique

8
Was meinst du mit "Lagerbehältern"? Wenn Sie Nur-Daten-Container meinen, die früher verwendet wurden, um Verweise auf Datenvolumes zu speichern, sind diese aufgrund der Verfügbarkeit von docker volumeUnterbefehlen und benannten Volumes nicht mehr erforderlich .
L0j1k

Beachten Sie, dass dies in Windows Powershell nicht funktioniert. Dafür ist dies eine bessere Lösung: stackoverflow.com/a/23674294/1150683
Bram Vanroy

@Sobrique Wenn Sie nicht reagieren, sollten Sie zumindest Ihren Kommentar löschen, es ist fast vollständig und schädlicher Unsinn.
Peter - Monica wieder einsetzen

128

Mit Docker 1.13 (4. Quartal 2016) haben Sie jetzt:

docker system prune -a löscht ALLE nicht verwendeten Daten (dh in der Reihenfolge: Container gestoppt, Volumes ohne Container und Bilder ohne Container).

docker system pruneohne -a werden (für Bilder) nur baumelnde Bilder oder Bilder ohne Tag entfernt, wie von smilebomb kommentiert .

Sehen PR 26108 und Commit 86de7c0 , in denen einige neue Befehle eingeführt werden, 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 -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

Wie wjv kommentiert,

Es gibt auch eine docker {container,image,volume,network} prune, die verwendet werden kann, um nicht verwendete Instanzen von nur einem Objekttyp zu entfernen .

Eingeführt in Commit 913e5cb , nur für Docker 1.13+.

docker container prune

Vielen Dank für das Teilen - damit dies sichtbar wird, zitiere ich Sie in der Antwort hoch oben im Thread
qkrijger

Fügen Sie wie gewohnt das -fFlag hinzu, um die Bereinigung zu erzwingen, ohne dass Fragen gestellt werden.
Dirk

3
sollte als die heutige richtige Antwort markiert werden, die meisten der oben genannten waren in der Zeit zurück, aber sind nodays überkompliziert
Eugen Mayer

Einverstanden, in letzter Zeit so viel einfacher, los geht's!
Maxim Geerinck

Die Beschreibung im Codeblock ist für docker system prune -a, wodurch nicht verwendete Bilder entfernt werden. Entferntdocker system prune nur baumelnde Bilder oder Bilder ohne Tag.
Smilebomb

104

Es ist jetzt möglich, Filterung zu verwenden mit docker ps:

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

Und für Bilder :

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

Jeder dieser Fehler verursacht docker rmoder docker rmilöst jedoch einen Fehler aus, wenn keine übereinstimmenden Container vorhanden sind. Die älterendocker rm $(docker ps -aq) Trick war noch schlimmer, als er versuchte, einen laufenden Container zu entfernen, was bei jedem fehlschlug.

Hier ist ein saubereres Skript, das Sie in Ihr ~/.bashrcoder hinzufügen können ~/.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
}

Bearbeiten: Wie unten angegeben, war die ursprüngliche Antwort das Entfernen von Bildern, nicht von Containern. Aktualisiert, um beide Fragen zu beantworten, einschließlich neuer Links zur Dokumentation. Vielen Dank an Adrian (und Ryans Antwort) für die Erwähnung der neuen psFilterung.


2
Beachten Sie den wirklichen Vorteil davon - Sie töten nicht versehentlich storageConatiners ab.
Sobrique

3
Sie können auch status=createdsolche verwenden, die nicht ausgeführt werden und noch nie ausgeführt wurden.
Enderland

96

AKTUALISIERT 2019 (NEUESTE)

docker container prune

Dies - 2017 (ALTER) Weg

So entfernen Sie ALLE STOPPED CONTAINER

docker rm $(docker ps -a -q)

ALLE BEHÄLTER entfernen (STOPPED UND NON STOPPED)

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

3
downvoted, da dies mit Sicherheit nicht so ist, wie Sie es 2017 tun - wie es sein würde docker volume/container/image prune, siehe stackoverflow.com/a/39860665/3625317
Eugen Mayer

6
upvoted, um der downvote entgegenzuwirken, weil a) diese Antwort aus dem Jahr 2016 stammt und b) viele Leute nicht auf dem neuesten Stand sind.
scharf

49

Entfernen Sie alle angehaltenen Behälter:

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

Aus dem Kommentar von pauk960 :

Seit Version 1.3.0 können Sie Filter docker psanstelle von grep Exitedverwenden docker ps -a -f status=exited. Und wenn Sie -qes verwenden, können Sie nur Container-IDs anstelle der vollständigen Ausgabe erhalten, ohne dass Sie dafür awk verwenden müssen.


33

Wenn Sie nicht alle Container entfernen möchten, können Sie alle Container auswählen, die vor oder nach einem bestimmten Container mit docker ps --before <container-ID>oder mit erstellt wurden docker ps --since <container-ID>. Diese Funktion ist mindestens in Docker Version 0.6.5 verfügbar.

Angenommen, Sie haben Ihr System entwickelt und jetzt funktioniert es, aber es sind noch einige Container übrig. Sie möchten Container entfernen, die vor dieser Arbeitsversion erstellt wurden. Bestimmen Sie die ID des Arbeitscontainers mit docker ps.

Entfernen Sie Container, die vor einem anderen Container erstellt wurden

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

Ein anderes Beispiel. Ihre Datenbank wird bereits auf einem Docker-Container ausgeführt. Sie haben Ihre Anwendung für die Ausführung auf einem anderen Container entwickelt und verfügen nun über eine Reihe nicht benötigter Container.

Entfernen Sie Container, die nach einem bestimmten Container erstellt wurden

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

Docker speichert Container /var/lib/docker/containersin Ubuntu. Ich denke, zusätzliche Container schaden nicht weiter, beanspruchen aber Speicherplatz.


32

Update: Ab Docker Version 1.13 (veröffentlicht im Januar 2017) können Sie den folgenden Befehl ausführen, um gestoppte Container, nicht verwendete Volumes, baumelnde Images und nicht verwendete Netzwerke zu bereinigen:

docker system prune

Wenn Sie sicherstellen möchten, dass Sie nur Container mit exitedStatus löschen, verwenden Sie Folgendes :

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

Wenn Sie Docker-Inhalte bereinigen, können Sie unmarkierte, unbenannte Bilder auf folgende Weise entfernen:

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

22

Hier ist mein docker-cleanupSkript, das Container und Bilder ohne Tags entfernt. Bitte überprüfen Sie die Quelle auf Aktualisierungen.

#!/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

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


@BradMurray Danke! Diese könnten Ihnen auch gefallen: github.com/blueyed/dotfiles/commit/…
blueyed

3
Funktioniert nicht unter OSX wegen der xargs --no-run-if-emptyOption
Caktux

13

Beenden Sie zunächst die Ausführung von Containern, bevor Sie versuchen, sie zu entfernen

Laufende Behälter entfernen

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

Sie könnten killanstelle von verwenden stop. In meinem Fall bevorzuge ich es, stopda ich dazu neige, sie erneut auszuführen, anstatt jedes Mal eine neue zu erstellen, also versuche ich, sie schön herunterzufahren.

Hinweis: Wenn Sie versuchen, einen Container anzuhalten, wird folgende Fehlermeldung angezeigt:

Fehler: Ein laufender Container kann nicht entfernt werden. Bitte stoppen Sie ihn zuerst

Entfernen Sie alle Behälter

docker rm $(docker ps -a -q)

11

Entfernen aller Container aus der Windows-Shell:

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

Ich werde dies in meine Antwort aufnehmen, da dies die erste Seite ist. Danke
qkrijger

"aus der Windows-Shell" ? Meinen Sie "Verwenden der Windows-Shell (CMD)" ?
Peter Mortensen

10

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

Docker-Bereinigung

Eine winzige All-in-One-Hülle, die entfernt:

  • Container, die nicht länger als einen Tag laufen
  • Bilder, die zu keinem verbleibenden Container gehören

Beabsichtigt, als Crontab-Job zu laufen

Merkmal

  • Es werden alle <none>:<none>Bilder entfernt
  • Wenn das Bild mehrere repo: tag-Verweise enthält, werden alle repo: tag-Tags entfernt, außer wenn ein Container ausgeführt wird. Eigentlich ist es eine Natur von "Docker RMI".
  • Auf dem Bildschirm werden viele Fehlermeldungen angezeigt, und Sie können entscheiden, ob Sie dies möchten 2>/dev/nulloder nicht
  • Lernen Sie etwas von docker-gc und beheben Sie das Problem (es kann kein Bild mit mehreren repo: tag entfernen)

9

Ich persönlich empfehle daher, dies als Teil Ihres Bereitstellungsskripts für Images und Container zu tun und nur die neuesten n Container und Images beizubehalten. Ich markiere meine Docker-Images mit demselben Versionsschema, mit dem ich sie verwende, und git tagmarkiere das neueste Docker-Image immer mit "Neueste". Dies bedeutet, dass meine Docker-Bilder ohne Bereinigung wie folgt aussehen:

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

Jetzt möchte ich natürlich nicht, dass alle meine Bilder (oder Container) auf allen meinen Produktionsboxen auf Dauer zurückkehren. Ich möchte nur die letzten 3 oder 4 für Rollbacks und um alles andere loszuwerden. Unix tailist dein bester Freund hier. Da docker imagesund docker psbeide nach Datum sortieren, können wir nur tailalle außer den ersten drei auswählen und entfernen:

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

Führen Sie dies zusammen mit Ihren Bereitstellungsskripten (oder lokal) aus, um immer gerade genug Bilder zu behalten, damit Sie bequem zurücksetzen können, ohne zu viel Platz zu beanspruchen oder Dinge mit alten Bildern zu überladen.

Persönlich habe ich immer nur einen Container auf meiner Produktionsbox, aber Sie können das Gleiche mit Containern tun, wenn Sie mehr wollen:

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

Schließlich haben wir es in meinem vereinfachten Beispiel immer nur mit einem Repository zu tun, aber wenn Sie mehr hatten, können Sie mit derselben Idee nur ein bisschen ausgefeilter werden. Angenommen, ich möchte nur die letzten drei Bilder von some_repo / some_image behalten. Ich kann einfach mischen grepund awkund sein auf dem Weg:

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

Auch hier gilt die gleiche Idee für Container, aber Sie bekommen sie zu diesem Zeitpunkt, sodass ich keine Beispiele mehr geben werde.


8

Verwenden:

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

Alle lokal vorhandenen Container werden gewaltsam angehalten und entfernt.


Bitte bearbeiten Sie mit weiteren Informationen. Nur-Code- und "Versuch dies" -Antworten werden nicht empfohlen, da sie keinen durchsuchbaren Inhalt enthalten und nicht erklären, warum jemand "dies versuchen" sollte. Wir bemühen uns hier, eine Ressource für Wissen zu sein.
Brian Tompsett - 莱恩 莱恩

In Ubuntu 16.04 benötigt Docker Sudo, sodass Sie schreiben müssen sudo docker rm -f $(sudo docker ps -a -q).
Elliott

Als Plus funktioniert dies auch unter Windows unter Powershell!
Robert Ivanc

@Elliott Ich denke, es sudoist überall erforderlich, es sei denn, Sie fügen Ihren Benutzer der Docker-Gruppe hinzu. Ich verwende Ubuntu 16.10 ohne Sudo, indem ich meinen Benutzer zur Docker-Gruppe hinzufüge.
Emory

7

Entfernen Sie 5 älteste Behälter:

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

Sehen Sie, wie viele Container noch übrig sind:

docker ps -aq | wc -l

Gute Arbeit @Pithikos. Ich habe die Antwort hinzugefügt, die alle alten Container entfernt.
Mostafa Ghadimi

7

Entfernen Sie alle angehaltenen Behälter.

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

Dadurch werden alle gestoppten Container entfernt, indem eine Liste aller Container mit Docker ps -a -q abgerufen und ihre IDs an Docker rm übergeben werden. Dadurch sollten keine laufenden Container entfernt werden, und es wird angezeigt, dass ein laufendes Image nicht entfernt werden kann.

Entfernen Sie alle Bilder ohne Tags

Jetzt möchten Sie alte Bilder bereinigen, um Platz zu sparen.

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


Vergessen Sie nicht, Docker-Volumes zu löschen, indem Sie die Option -v
angeben

Ich habe das nicht nachgeschlagen, aber ich denke das gleiche wie:docker ps -aq | xargs docker rm -v
Quine

Dies funktioniert nur unter Linux, nicht unter Windows ... Funktioniert jedoch docker rm -f $(docker ps -a -q)in PowerShell / Docker für Windows.
Peter Mortensen

6

Neuer Weg: spotify / docker-gc spielen den Streich.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Container, die vor mehr als einer Stunde beendet wurden, werden entfernt.
  • Bilder, die danach nicht mehr zu einem verbleibenden Container gehören, werden entfernt

Es wurden Umgebungseinstellungen unterstützt

Erzwingen des Löschens von Bildern mit mehreren Tags

 FORCE_IMAGE_REMOVAL=1

Löschen von Containern erzwingen

 FORCE_CONTAINER_REMOVAL=1 

Ausgenommen kürzlich verlassene Container und Bilder aus der Garbage Collection

 GRACE_PERIOD_SECONDS=86400

Diese Einstellung verhindert auch das Entfernen von Bildern, die vor weniger als GRACE_PERIOD_SECONDS erstellt wurden.

Probelauf

 DRY_RUN=1

Bereinigen verwaister Containervolumes bereinigen CLEAN_UP_VOLUMES = 1

Referenz: docker-gc

Alte Art zu tun:

Löschen Sie alte, nicht laufende Container

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

Löschen Sie alle Bilder, die nicht laufenden Docker-Containern zugeordnet sind

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

Bereinigen Sie verwaiste Docker-Volumes für Docker-Version 1.10.x und höher

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

Basierend auf dem Zeitraum

 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

1
Interessante Alternative. +1
VonC

6
  1. Entfernen Sie alle Docker-Prozesse:

    docker rm $(docker ps -a -q)
    
  2. Entfernen Sie einen bestimmten Behälter:

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


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

für diejenigen, die nicht selbst danach suchen wollen github.com/spotify/docker-gc
grimmig

Es ist perfekt. Ich habe auch eine Antwort geschrieben, die die gleiche Funktionalität hat.
Mostafa Ghadimi

3

Ich benutze immer docker rmi $(docker ps -a -q), um alle Bilder zu entfernen.

Sie können das Verzeichnis entfernen, /var/lib/docker/graphwenn dies docker rmifehlschlägt.


Vielen Dank für das Hinzufügen der Informationen / var / lib / docker / graph
Jonathan DeMarks

Die Frage war, wie man Container entfernt, keine Bilder.
pauk960

3

Sie können nur gestoppte Container entfernen. Stoppen Sie alle am Anfang

docker stop $(docker ps -a -q)

Dann können Sie entfernen

docker rm $(docker ps -a -q)


3

Versuchen Sie diesen Befehl, um Container und baumelnde Bilder zu reinigen.

docker system prune -f

Dies ist ein erstaunlicher Pro-Tipp!
b01

3

Die grundlegenden Schritte zum Stoppen / Entfernen aller Container und Bilder

  1. Listen Sie alle Container auf

    docker ps -aq

  2. Stoppen Sie alle laufenden Container

    docker stop $(docker ps -aq)

  3. Entfernen Sie alle Behälter

    docker rm $(docker ps -aq)

  4. Entfernen Sie alle Bilder

    docker rmi $(docker images -q)

Hinweis: Zuerst müssen Sie alle laufenden Container stoppen, bevor Sie sie entfernen. Bevor Sie ein Bild entfernen, müssen Sie die abhängigen Container anhalten und entfernen.


2

Für alle Interessierten habe ich das Beispiel von qkrijger genommen und daraus ein klares Alles gemacht (stoppen und alles entfernen)

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

Wenn Sie die Container trotzdem entfernen, docker rm -f $(docker ps --no-trunc -aq)ist es schneller
qkrijger

Richtig, aber wenn Sie es benötigen, um ordnungsgemäß heruntergefahren zu werden, um gemeinsam genutzte oder wiederverwendete Ressourcen zu bereinigen (z. B. angehängte Volumes, korrekt geschlossene aktive Verbindungen usw.), müssen Sie zuerst stop aufrufen. Ein gutes Beispiel: Wenn Sie einen Jenkins-Container haben, ist es eine schlechte Idee, den Container zu töten. Sie möchten, dass nicht gespeicherte Änderungen gespeichert, angemeldete Benutzer gewarnt und vor allem alle Builds ordnungsgemäß gestoppt werden.
Kraig McConaghy

vereinbart, das ist ein sehr gültiger Anwendungsfall
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

5
Wenn Sie antworten, ist es am besten, eine Erklärung zu haben, was die Lösung tut, und nicht nur einen Code-Dump, da sonst die Antwort möglicherweise gelöscht wird.
AlBlue


2

Ich benutze:

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

um verlassene Container zu löschen und:

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

um alle nicht getaggten Bilder loszuwerden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.