Docker está en volumen en uso, pero no hay ningún contenedor Docker

167

He tenido problemas para eliminar los volúmenes de Docker con Docker 1.9.1.

Eliminé todos mis contenedores detenidos para que docker ps -avuelvan vacíos.

Cuando lo uso docker volume ls, me dan una gran cantidad de contenedores Docker:

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

Como ninguno de estos volúmenes contiene nada importante, trato de purgar todos los volúmenes con docker volume rm $(docker volume ls -q).

En el proceso, la mayoría se eliminan, pero vuelvo:

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

Para una porción considerable de ellos. Si no tengo ningún contenedor en primer lugar, ¿cómo se utilizan estos volúmenes?

Tkwon123
fuente
77
Docker utiliza el recuento de referencias para verificar si un volumen todavía está en uso; todo esto se hace en memoria; esto puede ser un error o una condición de carrera de alguna manera, lo que resultó en la eliminación del contenedor, pero el contador no se actualizó. Un reinicio del demonio debería resolver esto, pero sí, es posible que haya un error en alguna parte. ¿Hay algo especial en su configuración (por ejemplo, ¿está utilizando docker-in-docker, Swarm?). ¿Utiliza algún script o herramienta para limpiar sus contenedores?
thaJeztah
55
Hola, gracias @thaJeztah reiniciando el demonio Docker ( sudo service docker stopy sudo service docker start) borró todos estos volúmenes fantasma para mí. Además, parece que ahora puedo eliminar volúmenes sin problemas usando el comando docker rm -v. Las únicas diferencias notables en el uso es que he estado usando docker-compose en Ubuntu 15.10. Informaré si alguna vez puedo replicar este problema, pero de lo contrario parece que un simple reinicio será suficiente. ¡Gracias!
Tkwon123
2
incluso después de reiniciar el sistema todavía dice volumen de cargador de muelle está en uso ..
holms
10
Si usa docker compose, puede agregar -v al comando down, para eliminar los volúmenes.
Niels Bech Nielsen
55
Solucioné esto deteniendo la ventana acoplable y luego eliminando los volúmenes del sistema de archivos e iniciando nuevamente la ventana acoplable. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

Respuestas:

169

Puede usar estas funciones para eliminar brutalmente todo lo relacionado con 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)
}

Puede agregarlos a su ~/Xrcarchivo, donde X es su archivo de intérprete de shell ( ~/.bashrcsi está usando bash) y volver a cargarlos mediante la ejecución source ~/Xrc. Además, puede copiarlos y pegarlos en la consola y luego (independientemente de la opción que haya elegido antes para preparar las funciones) simplemente ejecute:

armageddon

También es útil para la limpieza general de Docker. Tenga en cuenta que esto también eliminará sus imágenes, no solo sus contenedores (ya sean en ejecución o no) y sus volúmenes de cualquier tipo.

David González Ruiz
fuente
3
Según la pregunta, el docker volume rmcomando estaba fallando. A partir de los comentarios, la solución parece ser reiniciar el demonio docker para corregir el recuento de referencias.
BMitch
2
@BMitch si lees cuidadosamente los comentarios, esa no es la solución para esto:even after reboot it still says docker volume is in use..
David González Ruiz
1
Holms parece tener un problema diferente y no es el que publicó la pregunta. Busque un comentario encima de eso.
BMitch
10
The gonsales, 👏para el nombre de la función pero está escritoarmageddon
Joseph Sheedy
1
Esto no resolvió mi problema. docker-compose down --volumesSin embargo, usando did (como lo sugiere @Robert K. Bell)
BiAiB
159

Tal vez el volumen fue creado a través de docker-compose? Si es así, debe ser eliminado por:

docker-compose down --volumes

¡Crédito a Niels Bech Nielsen !

Robert K. Bell
fuente
3
Esto funciona :) Es bueno tener en cuenta que esto también elimina todos los contenedores. Esto puede ser no deseado si cambió los archivos en el contenedor que no están en un montaje permanente y no en la imagen.
Alexander Varwijk
58

Soy bastante nuevo en Docker. Estaba limpiando algunos problemas iniciales de prueba y tampoco pude eliminar un volumen. Detuve todas las instancias en ejecución, realicé una docker rmi -f $(docker image ls -q), pero aún recibí la Error response from daemon: unable to remove volume: remove uuid: volume is in use.

Hice un docker system pruney limpió lo que se necesitaba para eliminar el último volumen:

[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

El cliente y la API del demonio deben ser al menos 1.25 para usar este comando. Use el docker versioncomando en el cliente para verificar sus versiones de API de cliente y demonio.

Benjamin West
fuente
por alguna razón tuve que hacer esto dos veces antes de que funcionara.
mameluc
1
Tuve que hacer la "poda del sistema docker" y luego "docker volume rm volume_name". Por alguna razón, pode los contenedores eliminados que ya había eliminado. confundido .
Matthew Rideout
54

El volumen puede estar en uso por uno de los contenedores detenidos. Puede eliminar dichos contenedores por comando:

docker container prune

entonces puede eliminar volúmenes no utilizados

docker volume prune
Ryabchenko Alexander
fuente
1
esta debería ser la respuesta aceptada, no sé por qué a la gente le gusta la respuesta dada
Elger Mensonides
9

Mientras los volúmenes estén asociados con un contenedor (en ejecución o no), no se pueden eliminar.

Tienes que correr

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

en cada uno de los contenedores en ejecución / no en ejecución donde este volumen podría haberse montado.

Si el volumen está montado en cualquiera de los contenedores, debería verlo en la sección Montajes de la salida del comando inspeccionar . Algo como esto :-

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

Después de descifrar los contenedores responsables, use: -

docker rm -f container-1 container-2 ...container-n en caso de funcionamiento de contenedores

docker rm container-1 container-2 ...container-n en caso de contenedores que no funcionan

para eliminar completamente los contenedores de la máquina host.

Luego intente eliminar el volumen con el comando: -

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

Supreeth Padavala
fuente
1
Para una respuesta útil, esta reacción debe extenderse. Agregue información sobre cómo verificar esto.
Jeroen Heier
1
Apuesto a que docker container prunedebe ser suficiente en la mayoría de los casos.
x-yuri
6

Actualmente puede usar lo que Docker ofrece ahora para una limpieza general y más completa:

docker system prune

Para eliminar adicionalmente los contenedores detenidos y todas las imágenes no utilizadas (no solo las imágenes colgantes), agregue el -aindicador al comando:

docker system prune -a
Shackra
fuente
3

Estoy bastante seguro de que esos volúmenes están realmente montados en su sistema. Mire en / proc / montes y los verá allí. Es probable que necesite sudo umount <path>o sudo umount -f -n <path>. Debería poder obtener la ruta montada en / proc / mounts o a través dedocker volume inspect

Jiri Klouda
fuente
-3

Debe escribir este comando con la bandera -f (force):

sudo docker volume rm -f <VOLUME NAME>

Julia
fuente