Jak usunąć wszystkie woluminy Dockera?

94

Jeśli zrobię docker volume ls, moja lista woluminów wygląda następująco:

DRIVER              VOLUME NAME
local               305eda2bfd9618266093921031e6e341cf3811f2ad2b75dd7af5376d037a566a
local               226197f60c92df08a7a5643f5e94b37947c56bdd4b532d4ee10d4cf21b27b319
...
...
local               209efa69f1679224ab6b2e7dc0d9ec204e3628a1635fa3410c44a4af3056c301

i chcę usunąć wszystkie moje woluminy naraz. Jak mogę to zrobić?

Avara
źródło

Odpowiedzi:

194

Oficjalne polecenie usunięcia wszystkich nieużywanych danych (w tym woluminów bez kontenerów) będzie dostępne w dockerze 1.13

docker system prune  

Jeśli chcesz ograniczyć się do samych woluminów, usuwając tylko nieużywane woluminy :

docker volume prune

Trzeba też docker image prune, docker container pruneitd:
zobacz więcej na „ suszonych śliwek nieużywany dokowanym obiektów ”.

Zobacz commit 86de7c0 i PR 26108 .

Możesz zobaczyć to w akcji na play-with-docker.com :

/ # docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
1296a5e47ef3        hello-world         "/hello"            7 seconds ago       Exited (0) 6 seconds ago                       prickly_poincare

/ # docker system  prune
WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all dangling images
Are you sure you want to continue? [y/N] y
Deleted Containers:
1296a5e47ef3ab021458c92ad711ad03c7f19dc52f0e353f56f062201aa03a35

Obecny (pre-docker 1.13) sposób zarządzania wolumenem został wprowadzony wraz z PR 14242 oraz docker volumepoleceniem , które dokumentuje w komentarzu z lipca 2015 r .:

docker volume rm $(docker volume ls -q --filter dangling=true)
VonC
źródło
To świetnie, dzięki. Nie wiedziałem o nowych prunepoleceniach.
treeface
3
Polecenia dotyczące śliwek są świetne, ale uważaj na nie. Wygląda na to, że zakładają, że kontenery są uruchomione w momencie ich wywołania. Usunie rzeczy, które mogą być powiązane, ale nie są aktywnie używane (np. Sieci), co prowadzi do awarii przy następnym uruchomieniu istniejących kontenerów. Użyj danglingfiltrów z wyprzedzeniem, jeśli nie masz pewności, co może zostać przycięte :)
żart.
docker system prunenie wydaje się usuwać lokalnych woluminów, ale docker volume pruneje
segreguje
23

Edytowane w 2017 r .: Ta odpowiedź została udzielona 16 kwietnia 2016 r., A teraz jest nieaktualna i poprawna tylko dla wersji dockera wcześniejszej niż 1.13, użyj odpowiedzi z @VonC, teraz jest oznaczona jako poprawna

Aby usunąć nieużywane woluminy, możesz użyć wbudowanego volume rmpolecenia docker . rmPolecenie usuwa również dowolny katalog, w /var/lib/docker/volumesktórych nie jest objętość, więc upewnij się, że nie umieścić coś tam chcesz zapisać:
Polecenie do objętości listy, trochę prawo niż Twoja:

$ docker volume ls -qf dangling=true

Sprzątać:

$ docker volume rm $(docker volume ls -qf dangling=true)

więcej szczegółów o ls tutaj , o rm tutaj

vvchik
źródło
1
Nie uruchomiłbym go bez uprzedniego przetestowania listy wiszących woluminów z --dry-runparametrem.
Siergiej Rodionow
Nie ma --dry-runopcji.
Harald Albers
1
ta odpowiedź jest właściwa, jeśli chcesz usunąć wszystkie woluminy bez względu na wszystko. dzięki!
Mücahit Yılmaz
5

Oto, co uznałem za przydatne: https://github.com/chadoe/docker-cleanup-volumes

Shellscript do usuwania osieroconych woluminów docker w / var / lib / docker / volume and / var / lib / docker / vfs / dir Docker w wersji od 1.4.1 do 1.11.x

Zasadniczo czyści wszelkie osierocone / wiszące woluminy, ale zawiera, --dry-runale odnotowuje również niektóre polecenia dołączone do dockera (do których odwołuje się poprzedni komentarz)

Uwaga dotycząca platformy Docker 1.9 i nowszych

Aby usunąć osierocone woluminy w Docker 1.9 i nowszych, możesz również użyć wbudowanych poleceń woluminów platformy Docker zamiast tego skryptu docker-cleanup-volume. Wbudowane polecenie usuwa również każdy katalog w / var / lib / docker / volume, który nie jest woluminem, więc upewnij się, że nie umieściłeś tam niczego, co chcesz zapisać:

Lista:

$ docker volume ls -qf dangling=true

Sprzątać:

$ docker volume rm $(docker volume ls -qf dangling=true)

Lub lepiej radzić sobie z systemem no-op, ale specyficznym dla systemu Linux:

$ docker volume ls -qf dangling=true | xargs -r docker volume rm
Marc Young
źródło
3

Aby odpowiedzieć na pytanie i pożyczyć od Marca, działa to:

$ docker volume rm $(docker volume ls -qf dangling=true | xargs)
Jonathan Lin
źródło