Docker è in uso nel volume, ma non ci sono contenitori Docker


167

Ho avuto problemi con la rimozione dei volumi Docker con Docker 1.9.1.

Ho rimosso tutti i miei contenitori bloccati in modo che docker ps -aritorni vuoto.

Quando uso docker volume ls, mi viene dato un intero host di contenitori Docker:

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

Poiché nessuno di questi volumi contiene qualcosa di importante, provo a eliminare tutti i volumi docker volume rm $(docker volume ls -q).

Nel processo, la maggior parte viene rimossa, ma torno indietro:

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

Per una parte considerevole di essi. Se in primo luogo non ho contenitori esistenti, come vengono utilizzati questi volumi?


7
la finestra mobile utilizza il conteggio dei riferimenti per verificare se un volume è ancora in uso; questo è tutto fatto in memoria; questo potrebbe essere un bug o una condizione di competizione, che ha comportato la rimozione del contenitore, ma il contatore non è stato aggiornato. Un riavvio del demone dovrebbe risolvere questo problema, ma sì, è possibile che ci sia un bug da qualche parte. C'è qualcosa di speciale nella tua configurazione (ad es. Stai usando docker-in-docker, Swarm?). Usi qualche script o strumento per pulire i tuoi contenitori?
ThaJeztah,

5
Ehi grazie @thaJeztah che riavvia il demone Docker ( sudo service docker stope sudo service docker start) ha cancellato tutti questi volumi fantasma per me. Inoltre, sembra che ora sia possibile rimuovere i volumi senza problemi utilizzando il comando docker rm -v. L'unica differenza notevole nell'uso è che sto usando Docker-compose su Ubuntu 15.10. Riporterò indietro se sarò mai in grado di replicare questo problema, ma per il resto sembra sufficiente un semplice riavvio. Grazie!
Tkwon123,

2
anche dopo il riavvio dice ancora che il volume della finestra mobile è in uso ..
holms

10
Se si utilizza la finestra mobile componi, è possibile aggiungere -v al comando giù per rimuovere i volumi.
Niels Bech Nielsen,

5
Ho risolto questo problema arrestando la finestra mobile, quindi rimuovendo i volumi dal file system e riavviando la finestra mobile. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom,

Risposte:


169

È possibile utilizzare queste funzioni per rimuovere brutalmente tutto ciò che riguarda Docker:

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

Puoi aggiungerli al tuo ~/Xrcfile, dove X è il tuo file interprete di shell ( ~/.bashrcse stai usando bash) e ricaricarli tramite l'esecuzione source ~/Xrc. Inoltre, puoi semplicemente copiarli incollandoli sulla console e successivamente (indipendentemente dall'opzione che hai preso prima per preparare le funzioni) basta eseguire:

armageddon

È anche utile solo per la pulizia generale di Docker. Tieni presente che questo rimuoverà anche le tue immagini, non solo i tuoi contenitori (in esecuzione o meno) e i tuoi volumi di qualsiasi tipo.


3
Per la domanda, il docker volume rmcomando non riusciva. Dai commenti, la soluzione sembra essere quella di riavviare il daemon docker per correggere il conteggio dei riferimenti.
BMitch

2
@BMitch se leggi attentamente i commenti, questa non è la soluzione per questo:even after reboot it still says docker volume is in use..
David González Ruiz

1
holms sembra avere un problema diverso e non è quello che ha pubblicato la domanda. Cerca un commento sopra quello.
BMitch

10
I gonsales, 👏per il nome della funzione ma è scrittoarmageddon
Joseph Sheedy il

1
Questo non ha risolto il mio problema. Usando docker-compose down --volumesdid però (come suggerito da @Robert K. Bell)
BiAiB il

159

Forse il volume è stato creato tramite docker-compose? In tal caso, dovrebbe essere rimosso da:

docker-compose down --volumes

Ringraziamo Niels Bech Nielsen !


3
Funziona :) Va notato che questo rimuove anche tutti i contenitori stessi. Ciò può essere indesiderato se nel file sono stati modificati file che non si trovano su un supporto permanente e non nell'immagine.
Alexander Varwijk,

58

Sono abbastanza nuovo su Docker. Stavo risolvendo un po 'di confusione nei test iniziali e non ero nemmeno in grado di rimuovere un volume. Avevo interrotto tutte le istanze in esecuzione, eseguito un docker rmi -f $(docker image ls -q), ma ancora ricevuto il Error response from daemon: unable to remove volume: remove uuid: volume is in use.

Ho fatto un docker system prunee ha ripulito ciò che era necessario per rimuovere l'ultimo volume:

[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

L'API client e daemon deve essere almeno 1,25 per utilizzare questo comando. Utilizzare il docker versioncomando sul client per verificare le versioni API client e demone.


per qualche motivo ho dovuto farlo due volte prima che funzionasse.
Mameluc,

1
Ho dovuto fare il "docker system prune" e poi "docker volume rm volume_name". Per qualche motivo, potare i contenitori eliminati che avevo già eliminato. confusa .
Matthew Rideout,

54

Il volume può essere utilizzato da uno dei contenitori arrestati. È possibile rimuovere tali contenitori dal comando:

docker container prune

quindi è possibile rimuovere i volumi non utilizzati

docker volume prune

1
questa dovrebbe essere la risposta accettata, non so perché alla gente piaccia la risposta data
Elger Mensonides,

9

Finché i volumi sono associati a un contenitore (in esecuzione o meno), non possono essere rimossi.

Devi correre

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

su ciascuno dei contenitori in esecuzione / non in esecuzione su cui questo volume potrebbe essere stato montato.

Se il volume è montato su uno qualsiasi dei contenitori, dovresti vederlo nella sezione Montaggi dell'output del comando inspect. Qualcosa come questo :-

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

Dopo aver individuato i contenitori responsabili, utilizzare: -

docker rm -f container-1 container-2 ...container-n in caso di contenitori funzionanti

docker rm container-1 container-2 ...container-n in caso di contenitori non funzionanti

per rimuovere completamente i contenitori dal computer host.

Quindi provare a rimuovere il volume usando il comando: -

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


1
Per una risposta utile questa reazione deve essere estesa. Aggiungi informazioni su come controllare questo.
Jeroen Heier,

1
Scommetto che docker container prunenella maggior parte dei casi è sufficiente.
X-Yuri,

6

Attualmente è possibile utilizzare ciò che la finestra mobile offre ora per una pulizia generale e più completa:

docker system prune

Per rimuovere ulteriormente eventuali contenitori fermi e tutte le immagini inutilizzate (non solo le immagini pendenti), aggiungi il -aflag al comando:

docker system prune -a

3

Sono abbastanza sicuro che quei volumi siano effettivamente montati sul tuo sistema. Guarda in / proc / mount e li vedrai lì. Probabilmente dovrai sudo umount <path>o sudo umount -f -n <path>. Dovresti essere in grado di ottenere il percorso montato in / proc / mounts o throughdocker volume inspect


-3

Dovresti digitare questo comando con flag -f (force):

sudo docker volume rm -f <VOLUME NAME>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.