Docker jest w użyciu, ale nie ma żadnych kontenerów platformy Docker

166

Mam problemy z usuwaniem woluminów Dockera za pomocą Dockera 1.9.1.

Usunąłem wszystkie moje zatrzymane kontenery, więc docker ps -awracają puste.

Kiedy używam docker volume ls, otrzymuję cały szereg kontenerów Docker:

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

Ponieważ żaden z tych tomów nie zawiera niczego ważnego, staram się wyczyścić wszystkie tomy za pomocą docker volume rm $(docker volume ls -q).

W trakcie procesu większość jest usuwana, ale wracam:

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

Za sporą część z nich. Jeśli w ogóle nie mam żadnych kontenerów, w jaki sposób są one wykorzystywane?

Tkwon123
źródło
7
docker używa liczenia odwołań, aby sprawdzić, czy wolumin jest nadal używany; to wszystko odbywa się w pamięci; może to być jakiś błąd lub stan wyścigu, który spowodował usunięcie kontenera, ale licznik nie został zaktualizowany. Ponowne uruchomienie demona powinno rozwiązać ten problem, ale tak, możliwe, że gdzieś jest błąd. Czy jest coś specjalnego w twojej konfiguracji (np. Czy używasz docker-in-docker, Swarm?). Czy używasz jakiegoś skryptu lub narzędzia do czyszczenia kontenerów?
thaJeztah
5
Hej, dzięki @thaJeztah, ponownie uruchamiając demona Dockera ( sudo service docker stopi sudo service docker start) wyczyścił dla mnie wszystkie te woluminy-widma. Co więcej, wygląda na to, że mogę teraz bez problemu usuwać woluminy za pomocą polecenia docker rm -v. Jedyną godną uwagi różnicą w użytkowaniu jest to, że używam docker-compose na Ubuntu 15.10. Oddam raport, jeśli kiedykolwiek będę w stanie odtworzyć ten problem, ale poza tym wydaje się, że wystarczy prosty restart. Dzięki!
Tkwon123,
2
nawet po ponownym uruchomieniu nadal pokazuje, że wolumin Dockera jest używany ..
holms,
10
Jeśli używasz docker compose, możesz dodać -v do polecenia down, aby usunąć woluminy.
Niels Bech Nielsen
5
Naprawiłem to, zatrzymując docker, a następnie usuwając woluminy z systemu plików i ponownie uruchamiając docker. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

Odpowiedzi:

169

Możesz użyć tych funkcji, aby brutalnie usunąć wszystko, co dotyczy Dockera:

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)
}

Możesz dodać je do swojego ~/Xrcpliku, gdzie X jest twoim plikiem interpretera powłoki ( ~/.bashrcjeśli używasz bash) i załadować je ponownie poprzez wykonanie source ~/Xrc. Możesz też po prostu skopiować i wkleić je do konsoli, a następnie (niezależnie od opcji, którą wybrałeś wcześniej, aby przygotować funkcje) po prostu uruchom:

armageddon

Jest to również przydatne do zwykłego czyszczenia Dockera. Pamiętaj, że spowoduje to również usunięcie obrazów, a nie tylko kontenerów (działających lub nie) i wszelkiego rodzaju woluminów.

David González Ruiz
źródło
3
Zgodnie z pytaniem docker volume rmpolecenie zawiodło. Z komentarzy wynika, że ​​rozwiązaniem wydaje się być ponowne uruchomienie demona Dockera w celu naprawienia liczby odwołań.
BMitch
2
@BMitch, jeśli uważnie czytasz komentarze, to nie jest rozwiązanie tego problemu:even after reboot it still says docker volume is in use..
David González Ruiz,
1
Wydaje się, że holms ma inny problem i nie jest tym, który opublikował pytanie. Wyszukaj jeden komentarz powyżej.
BMitch
10
Gonsales, 👏na nazwa funkcji, ale jest zapisanaarmageddon
Joseph Sheedy
1
To nie rozwiązało mojego problemu. Używając docker-compose down --volumesjednak (zgodnie z sugestią @Robert K. Bell)
BiAiB,
159

Może wolumin został utworzony za pośrednictwem docker-compose? Jeśli tak, powinien zostać usunięty przez:

docker-compose down --volumes

Podziękowania dla Nielsa Becha Nielsena !

Robert K. Bell
źródło
3
To działa :) Warto zauważyć, że powoduje to również usunięcie wszystkich kontenerów. Może to być niepożądane, jeśli zmienisz pliki w kontenerze, które nie znajdują się na stałe i nie znajdują się w obrazie.
Alexander Varwijk,
58

Jestem całkiem nowy w Dockerze. Sprzątałem początkowy bałagan podczas testów i nie byłem w stanie usunąć woluminu. Zatrzymałem wszystkie uruchomione instancje, wykonałem polecenie docker rmi -f $(docker image ls -q), ale nadal otrzymałem plik Error response from daemon: unable to remove volume: remove uuid: volume is in use.

Zrobiłem docker system prunei wyczyściłem to, co było potrzebne do usunięcia ostatniego woluminu:

[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

Aby można było użyć tej komendy, interfejs API klienta i demona musi mieć co najmniej 1,25. Użyj docker versionpolecenia na kliencie, aby sprawdzić wersje interfejsu API klienta i demona.

Benjamin West
źródło
z jakiegoś powodu musiałem to zrobić dwa razy, zanim zadziałało.
mameluc
1
Musiałem wykonać „docker system prune”, a następnie „docker volume rm volume_name”. Z jakiegoś powodu przycinam usunięte kontenery, które już usunąłem. zdezorientowany .
Matthew Rideout
54

Objętość może być używana przez jeden z zatrzymanych pojemników. Możesz usunąć takie kontenery poleceniem:

docker container prune

następnie możesz usunąć nieużywane woluminy

docker volume prune
Ryabchenko Alexander
źródło
1
to powinna być akceptowana odpowiedź, nie wiem, dlaczego ludziom podoba się udzielona odpowiedź
Elger Mensonides
9

Dopóki woluminy są skojarzone z kontenerem (działającym lub nie), nie można ich usunąć.

Musisz biec

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

na każdym z działających / niedziałających kontenerów, na których ten wolumin mógł zostać zamontowany.

Jeśli wolumin jest zamontowany na którymkolwiek z kontenerów, powinieneś zobaczyć go w sekcji Mounts w wyniku polecenia inspect . Coś takiego :-

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

Po ustaleniu odpowiedzialnego pojemnika (ów) użyj: -

docker rm -f container-1 container-2 ...container-n w przypadku prowadzenia kontenerów

docker rm container-1 container-2 ...container-n w przypadku niedziałających kontenerów

aby całkowicie usunąć pojemniki z komputera hosta.

Następnie spróbuj usunąć wolumin za pomocą polecenia: -

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

Supreeth Padavala
źródło
1
Aby uzyskać użyteczną odpowiedź, tę reakcję należy rozszerzyć. Dodaj informacje, jak to sprawdzić.
Jeroen Heier
1
Założę docker container prunesię, że w większości przypadków wystarczy.
x-yuri
6

Obecnie możesz użyć tego, co teraz oferuje docker, do ogólnego i bardziej kompleksowego czyszczenia:

docker system prune

Aby dodatkowo usunąć zatrzymane kontenery i wszystkie nieużywane obrazy (nie tylko wiszące obrazy), dodaj -aflagę do polecenia:

docker system prune -a
shackra
źródło
3

Jestem prawie pewien, że te woluminy są faktycznie zamontowane w twoim systemie. Zajrzyj do / proc / mounts, a zobaczysz je tam. Prawdopodobnie będziesz musiał sudo umount <path>lub sudo umount -f -n <path>. Powinieneś być w stanie uzyskać zamontowaną ścieżkę w / proc / mounts lub przezdocker volume inspect

Jiri Klouda
źródło
-3

Powinieneś wpisać to polecenie z flagą -f (force):

sudo docker volume rm -f <VOLUME NAME>

Julia
źródło