Docker wird in großem Umfang verwendet, es sind jedoch keine Docker-Container vorhanden

166

Ich habe Probleme beim Entfernen von Docker-Volumes mit Docker 1.9.1.

Ich habe alle meine gestoppten Container entfernt, damit sie docker ps -aleer zurückkehren.

Wenn ich benutze docker volume ls, bekomme ich eine ganze Reihe von Docker-Containern:

docker volume ls
DRIVER              VOLUME NAME
local               a94211ea91d66142886d72ec476ece477bb5d2e7e52a5d73b2f2f98f6efa6e66
local               4f673316d690ca2d41abbdc9bf980c7a3f8d67242d76562bbd44079f5f438317
local               eb6ab93effc4b90a2162e6fab6eeeb65bd0e4bd8a9290e1bad503d2a47aa8a78
local               91acb0f7644aec16d23a70f63f70027899017a884dab1f33ac8c4cf0dabe5f2c
local               4932e2fbad8f7e6246af96208d45a266eae11329f1adf176955f80ca2e874f69
local               68fd38fc78a8f02364a94934e9dd3b5d10e51de5b2546e7497eb21d6a1e7b750
local               7043a9642614dd6e9ca013cdf662451d2b3df6b1dddff97211a65ccf9f4c6d47
#etc x 50

Da keines dieser Volumes etwas Wichtiges enthält, versuche ich, alle Volumes mit zu löschen docker volume rm $(docker volume ls -q).

Dabei werden die meisten entfernt, aber ich komme zurück:

Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use

Für einen beträchtlichen Teil von ihnen. Wie werden diese Volumes verwendet, wenn überhaupt keine Container vorhanden sind?

Tkwon123
quelle
7
Docker verwendet die Referenzzählung, um zu überprüfen, ob ein Volume noch verwendet wird. Dies geschieht alles im Speicher. Dies kann ein Fehler oder eine Rennbedingung sein, die dazu führte, dass der Container entfernt wurde, der Zähler jedoch nicht aktualisiert wurde. Ein Neustart des Daemons sollte dies beheben, aber es ist möglich, dass irgendwo ein Fehler vorliegt. Gibt es etwas Besonderes in Ihrem Setup (z. B. Verwenden Sie Docker-in-Docker, Swarm?). Verwenden Sie ein Skript oder Tool, um Ihre Container zu bereinigen?
ThaJeztah
5
Hey, danke @thaJeztah, der den Docker-Daemon neu gestartet hat ( sudo service docker stopund sudo service docker start), hat all diese Geister-Volumes für mich gelöscht. Außerdem scheint es mir jetzt möglich zu sein, Volumes mit dem Befehl docker rm -v ohne Probleme zu entfernen. Der einzige bemerkenswerte Unterschied in der Verwendung ist, dass ich Docker-Compose unter Ubuntu 15.10 verwendet habe. Ich melde mich zurück, wenn ich dieses Problem jemals replizieren kann, aber ansonsten scheint ein einfacher Neustart ausreichend zu sein. Vielen Dank!
Tkwon123
2
Auch nach dem Neustart heißt es immer noch, dass Docker-Volume verwendet wird.
Holms
10
Wenn Sie Docker Compose verwenden, können Sie dem Befehl down -v -v hinzufügen, um die Volumes zu entfernen.
Niels Bech Nielsen
5
Ich habe dies behoben, indem ich Docker gestoppt, dann die Volumes aus dem Dateisystem entfernt und Docker erneut gestartet habe. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

Antworten:

169

Mit diesen Funktionen können Sie alles, was mit Docker zu tun hat, brutal entfernen:

removecontainers() {
    docker stop $(docker ps -aq)
    docker rm $(docker ps -aq)
}

armageddon() {
    removecontainers
    docker network prune -f
    docker rmi -f $(docker images --filter dangling=true -qa)
    docker volume rm $(docker volume ls --filter dangling=true -q)
    docker rmi -f $(docker images -qa)
}

Sie können diese zu Ihrer ~/XrcDatei hinzufügen , wobei X Ihre Shell-Interpreter-Datei ist ( ~/.bashrcwenn Sie Bash verwenden), und sie über die Ausführung neu laden source ~/Xrc. Sie können sie auch einfach kopieren, in die Konsole einfügen und anschließend (unabhängig von der Option, die Sie zuvor gewählt haben, um die Funktionen vorzubereiten) einfach ausführen:

armageddon

Es ist auch nützlich für die allgemeine Bereinigung von Docker. Denken Sie daran, dass dadurch auch Ihre Bilder entfernt werden, nicht nur Ihre Container (entweder ausgeführt oder nicht) und Ihre Volumes jeglicher Art.

David González Ruiz
quelle
3
Gemäß der Frage schlug der docker volume rmBefehl fehl. Aus den Kommentaren geht hervor, dass die Lösung darin besteht, den Docker-Daemon neu zu starten, um die Referenzanzahl zu korrigieren.
BMitch
2
@BMitch, wenn Sie die Kommentare sorgfältig durchlesen, ist das nicht die Lösung dafür:even after reboot it still says docker volume is in use..
David González Ruiz
1
holms scheint ein anderes Problem zu haben und ist nicht das, das die Frage gestellt hat. Schlagen Sie einen Kommentar darüber nach.
BMitch
10
Die Gonsales, 👏für den Funktionsnamen, aber es wird geschriebenarmageddon
Joseph Sheedy
1
Dies hat mein Problem nicht gelöst. Verwendung docker-compose down --volumestat jedoch (wie von @Robert K. Bell vorgeschlagen)
BiAiB
159

Vielleicht wurde das Volume über erstellt docker-compose? Wenn ja, sollte es entfernt werden durch:

docker-compose down --volumes

Dank an Niels Bech Nielsen !

Robert K. Bell
quelle
3
Dies funktioniert :) Es ist gut zu beachten, dass dadurch auch alle Container selbst entfernt werden. Dies kann unerwünscht sein, wenn Sie Dateien im Container geändert haben, die sich nicht auf einem permanenten Mount befinden und nicht im Image.
Alexander Varwijk
58

Ich bin ziemlich neu bei Docker. Ich habe einige anfängliche Testprobleme behoben und konnte auch kein Volume entfernen. Ich hatte alle laufenden Instanzen gestoppt, eine ausgeführt docker rmi -f $(docker image ls -q), aber trotzdem die erhalten Error response from daemon: unable to remove volume: remove uuid: volume is in use.

Ich habe ein docker system pruneund es hat aufgeräumt, was benötigt wurde, um das letzte Volume zu entfernen:

[0]$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
... about 15 containers UUID's truncated

Total reclaimed space: 2.273MB
[0]$ docker volume ls
DRIVER              VOLUME NAME
local              uuid
[0]$ docker volume rm uuid
uuid
[0]$

docker system prune

Die Client- und die Daemon-API müssen mindestens 1,25 sein, um diesen Befehl verwenden zu können. Verwenden Sie den docker versionBefehl auf dem Client, um Ihre Client- und Daemon-API-Versionen zu überprüfen.

Benjamin West
quelle
Aus irgendeinem Grund musste ich das zweimal machen, bevor es funktionierte.
Mameluc
1
Ich musste den "Docker System Prune" und dann "Docker Volume RM Volume_Name" ausführen. Löschen Sie aus irgendeinem Grund gelöschte Container, die ich bereits gelöscht hatte. verwirrt .
Matthew Rideout
54

Das Volumen kann von einem der gestoppten Container verwendet werden. Sie können solche Container mit dem folgenden Befehl entfernen:

docker container prune

Dann können Sie nicht verwendete Volumes entfernen

docker volume prune
Ryabchenko Alexander
quelle
1
Dies sollte die akzeptierte Antwort sein, keine Ahnung, warum die Leute die gegebene Antwort mögen
Elger Mensonides
9

Solange Volumes einem Container zugeordnet sind (entweder ausgeführt oder nicht), können sie nicht entfernt werden.

Du musst rennen

docker inspect <container-id>/<container-name>

auf jedem der laufenden / nicht laufenden Container, auf denen dieses Volume möglicherweise bereitgestellt wurde.

Wenn das Volume auf einem der Container bereitgestellt ist, sollte es im Abschnitt Mounts der Ausgabe des Inspect-Befehls angezeigt werden. Etwas wie das :-

"Mounts": [
            {
                "Type": "volume",
                "Name": "user1",
                "Source": "/var/lib/docker/volumes/user1/_data",
                "Destination": "/opt",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

Verwenden Sie nach dem Herausfinden der verantwortlichen Behälter: -

docker rm -f container-1 container-2 ...container-n bei laufenden Containern

docker rm container-1 container-2 ...container-n bei nicht laufenden Containern

um die Container vollständig vom Host-Computer zu entfernen.

Versuchen Sie dann, das Volume mit dem folgenden Befehl zu entfernen: -

docker volume remove <volume-name/volume-id>

Supreeth Padavala
quelle
1
Für eine nützliche Antwort muss diese Reaktion erweitert werden. Fügen Sie Informationen hinzu, wie Sie dies überprüfen können.
Jeroen Heier
1
Ich wette, docker container prunemuss in den meisten Fällen ausreichen.
X-Yuri
6

Derzeit können Sie das, was Docker jetzt anbietet, für eine allgemeine und vollständigere Reinigung verwenden:

docker system prune

Fügen Sie -adem Befehl das Flag hinzu, um zusätzlich angehaltene Container und alle nicht verwendeten Bilder (nicht nur baumelnde Bilder) zu entfernen :

docker system prune -a
Shackra
quelle
3

Ich bin mir ziemlich sicher, dass diese Volumes tatsächlich auf Ihrem System bereitgestellt sind. Schauen Sie in / proc / mounts und Sie werden sie dort sehen. Sie werden wahrscheinlich brauchen sudo umount <path>oder sudo umount -f -n <path>. Sie sollten in der Lage sein, den bereitgestellten Pfad entweder in / proc / mounts oder durch zu erhaltendocker volume inspect

Jiri Klouda
quelle
-3

Sie sollten diesen Befehl mit flag -f (force) eingeben:

sudo docker volume rm -f <VOLUME NAME>

Julia
quelle