Docker est en volume en cours d'utilisation, mais il n'y a pas de conteneurs Docker

167

J'ai eu des problèmes avec la suppression des volumes Docker avec Docker 1.9.1.

J'ai supprimé tous mes conteneurs arrêtés pour que les docker ps -aretours soient vides.

Lorsque j'utilise docker volume ls, on me donne toute une série de conteneurs Docker:

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

Comme aucun de ces volumes ne contient quoi que ce soit d'important, j'essaye de purger tous les volumes avec docker volume rm $(docker volume ls -q).

Dans le processus, la majorité sont supprimés, mais je reviens:

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

Pour une grande partie d'entre eux. Si je n'ai aucun conteneur existant en premier lieu, comment ces volumes sont-ils utilisés?

Tkwon123
la source
7
docker utilise le comptage de références pour vérifier si un volume est toujours utilisé; tout cela se fait en mémoire; cela peut être un bug ou une condition de concurrence, qui a entraîné la suppression du conteneur, mais le compteur n'a pas été mis à jour. Un redémarrage du démon devrait résoudre ce problème, mais oui, il est possible qu'il y ait un bogue quelque part. Y a-t-il quelque chose de spécial dans votre configuration (par exemple, utilisez-vous docker-in-docker, Swarm?). Utilisez-vous un script ou un outil pour nettoyer vos conteneurs?
thaJeztah
5
Hé merci @thaJeztah d'avoir redémarré le démon Docker ( sudo service docker stopet sudo service docker start) effacé tous ces volumes fantômes pour moi. De plus, il semble que je suis maintenant capable de supprimer des volumes sans problème en utilisant la commande docker rm -v. La seule différence notable d'utilisation est que j'utilise docker-compose sur Ubuntu 15.10. Je ferai un rapport si je suis jamais capable de reproduire ce problème, mais sinon, il semble qu'un simple redémarrage suffira. Merci!
Tkwon123
2
même après le redémarrage, il indique toujours que le volume du docker est en cours d'utilisation ..
holms
10
Si vous utilisez docker compose, vous pouvez ajouter -v à la commande down pour supprimer les volumes.
Niels Bech Nielsen
5
J'ai corrigé cela en arrêtant docker, puis en supprimant les volumes du système de fichiers et en redémarrant docker. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

Réponses:

169

Vous pouvez utiliser ces fonctions pour supprimer brutalement tout ce qui concerne 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)
}

Vous pouvez les ajouter à votre ~/Xrcfichier, où X est votre fichier d'interpréteur shell ( ~/.bashrcsi vous utilisez bash) et les recharger via l'exécution source ~/Xrc. De plus, vous pouvez simplement les copier-coller dans la console et ensuite (quelle que soit l'option que vous avez choisie auparavant pour préparer les fonctions), exécutez simplement:

armageddon

C'est également utile pour le nettoyage général de Docker. Gardez à l'esprit que cela supprimera également vos images, pas seulement vos conteneurs (en cours d'exécution ou non) et vos volumes de tout type.

David González Ruiz
la source
3
Selon la question, la docker volume rmcommande échouait. D'après les commentaires, la solution semble être de redémarrer le démon docker pour corriger le nombre de références.
BMitch
2
@BMitch si vous lisez attentivement les commentaires, ce n'est pas la solution pour cela:even after reboot it still says docker volume is in use..
David González Ruiz
1
holms semble avoir un problème différent et n'est pas celui qui a publié la question. Recherchez un commentaire ci-dessus.
BMitch
10
The gonsales, 👏pour le nom de la fonction mais il est orthographiéarmageddon
Joseph Sheedy
1
Cela n'a pas résolu mon problème. En utilisant docker-compose down --volumesdid cependant (comme suggéré par @Robert K. Bell)
BiAiB
159

Peut-être que le volume a été créé via docker-compose? Si tel est le cas, il devrait être supprimé par:

docker-compose down --volumes

Merci à Niels Bech Nielsen !

Robert K. Bell
la source
3
Cela fonctionne :) Il est bon de noter que cela supprime également tous les conteneurs eux-mêmes. Cela peut être indésirable si vous avez modifié des fichiers dans le conteneur qui ne sont pas sur un montage permanent et pas dans l'image.
Alexander Varwijk
58

Je suis assez nouveau dans Docker. J'étais en train de nettoyer un désordre de test initial et je n'ai pas non plus pu supprimer un volume. J'avais arrêté toutes les instances en cours d'exécution, effectué un docker rmi -f $(docker image ls -q), mais toujours reçu le fichier Error response from daemon: unable to remove volume: remove uuid: volume is in use.

J'ai fait un docker system pruneet il a nettoyé ce qui était nécessaire pour supprimer le dernier 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 du client et du démon doit être au moins égale à 1,25 pour utiliser cette commande. Utilisez la docker versioncommande sur le client pour vérifier vos versions d'API client et démon.

Benjamin West
la source
pour une raison quelconque, j'ai dû le faire deux fois avant que cela fonctionne.
mameluc
1
J'ai dû faire le "prune système docker" puis "docker volume rm volume_name". Pour une raison quelconque, élaguez les conteneurs supprimés que j'avais déjà supprimés. confus .
Matthew Rideout
54

Le volume peut être utilisé par l'un des conteneurs arrêtés. Vous pouvez supprimer ces conteneurs par commande:

docker container prune

alors vous pouvez supprimer les volumes non utilisés

docker volume prune
Ryabchenko Alexander
la source
1
cela devrait être la réponse acceptée, je ne sais pas pourquoi les gens aiment la réponse donnée
Elger Mensonides
9

Tant que les volumes sont associés à un conteneur (en cours d'exécution ou non), ils ne peuvent pas être supprimés.

Tu dois courir

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

sur chacun des conteneurs en cours d'exécution / non en cours d'exécution sur lesquels ce volume a pu être monté.

Si le volume est monté sur l'un des conteneurs, vous devriez le voir dans la section Montages de la sortie de la commande inspect. Quelque chose comme ça :-

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

Après avoir identifié le (s) conteneur (s) responsable (s), utilisez: -

docker rm -f container-1 container-2 ...container-n en cas de conteneurs en cours d'exécution

docker rm container-1 container-2 ...container-n en cas de conteneurs non fonctionnels

pour supprimer complètement les conteneurs de la machine hôte.

Essayez ensuite de supprimer le volume à l'aide de la commande: -

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

Supreeth Padavala
la source
1
Pour une réponse utile, cette réaction doit être étendue. Ajoutez des informations sur la façon de vérifier cela.
Jeroen Heier
1
Je parie que cela docker container prunedoit suffire dans la plupart des cas.
x-yuri
6

Actuellement, vous pouvez utiliser ce que docker propose maintenant pour un nettoyage général et plus complet:

docker system prune

Pour supprimer en outre tous les conteneurs arrêtés et toutes les images inutilisées (pas seulement les images pendantes), ajoutez l' -aindicateur à la commande:

docker system prune -a
shackra
la source
3

Je suis presque sûr que ces volumes sont réellement montés sur votre système. Regardez dans / proc / mounts et vous les verrez là-bas. Vous aurez probablement besoin de sudo umount <path>ou sudo umount -f -n <path>. Vous devriez pouvoir obtenir le chemin monté dans / proc / mounts ou viadocker volume inspect

Jiri Klouda
la source
-3

Vous devez taper cette commande avec l'indicateur -f (force):

sudo docker volume rm -f <VOLUME NAME>

Julia
la source