O Docker está em uso em volume, mas não há contêineres do Docker

166

Estou tendo problemas com a remoção de volumes do Docker com o Docker 1.9.1.

Eu removi todos os meus contêineres parados para que docker ps -aretornem vazios.

Quando uso docker volume ls, recebo vários contêineres do 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 nenhum desses volumes contém algo importante, tento limpar todos os volumes docker volume rm $(docker volume ls -q).

No processo, a maioria é removida, mas eu volto:

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 uma porção considerável deles. Se eu não tenho nenhum contêiner existente, como esses volumes estão sendo usados?

Tkwon123
fonte
7
a janela de encaixe usa a contagem de referência para verificar se um volume ainda está em uso; tudo isso é feito na memória; isso pode ser um bug ou uma condição de corrida, que resultou na remoção do contêiner, mas o contador não foi atualizado. Uma reinicialização do daemon deve resolver isso, mas sim, é possível que haja um erro em algum lugar. Existe algo especial em sua configuração (por exemplo, você está usando o docker-in-docker, Swarm?). Você usa algum script ou ferramenta para limpar seus contêineres?
thaJeztah
5
Ei, obrigado @thaJeztah, reiniciando o daemon do Docker ( sudo service docker stope sudo service docker start) limpou todos esses volumes fantasmas para mim. Além disso, parece que agora eu sou capaz de remover volumes sem problemas usando o comando docker rm -v. Apenas diferenças notáveis ​​no uso é que eu tenho usado o docker-compose no Ubuntu 15.10. Vou relatar se conseguir replicar esse problema, mas, caso contrário, parece que uma simples reinicialização será suficiente. Obrigado!
precisa saber é o seguinte
2
mesmo após a reinicialização ele ainda diz que o volume janela de encaixe está em uso ..
holms
10
Se você usar o docker compose, poderá adicionar -v ao comando down, para remover os volumes.
Niels Bech Nielsen
5
Corrigi isso interrompendo o docker, removendo os volumes do sistema de arquivos e iniciando o docker novamente. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
Jfgrissom 23/11

Respostas:

169

Você pode usar estas funções para remover brutalmente tudo o que estiver relacionado ao 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)
}

Você pode adicioná-los ao seu ~/Xrcarquivo, onde X é o seu interpretador de shell ( ~/.bashrcse você estiver usando o bash) e recarregá-los através da execução source ~/Xrc. Além disso, você pode simplesmente copiá-los e colá-los no console e depois (independentemente da opção que você tomou antes de preparar as funções), basta executar:

armageddon

Também é útil para a limpeza geral do Docker. Lembre-se de que isso também removerá suas imagens, não apenas seus contêineres (em execução ou não) e seus volumes de qualquer tipo.

David González Ruiz
fonte
3
Pela pergunta, o docker volume rmcomando estava falhando. A partir dos comentários, a solução parece ser reiniciar o daemon do docker para corrigir a contagem de referência.
BMitch 8/17
2
@BMitch se você ler cuidadosamente os comentários, que não é a solução para isso:even after reboot it still says docker volume is in use..
David González Ruiz
1
holms parece ter um problema diferente e não foi o que postou a pergunta. Procure um comentário acima disso.
BMitch 8/17
10
Os Gonsales, 👏for o nome da função, mas ele está escritoarmageddon
Joseph Sheedy
1
Isso não resolveu meu problema. Usando docker-compose down --volumesfez embora (como sugerido por @ Robert K. Bell)
BiAiB
159

Talvez o volume tenha sido criado via docker-compose? Nesse caso, ele deve ser removido por:

docker-compose down --volumes

Crédito para Niels Bech Nielsen !

Robert K. Bell
fonte
3
Isso funciona :) É bom observar que isso também remove todos os contêineres. Isso pode ser indesejado se você alterou os arquivos no contêiner que não estão em uma montagem permanente e não estão na imagem.
Alexander Varwijk
58

Eu sou bastante novo no Docker. Eu estava limpando uma bagunça de teste inicial e também não consegui remover um volume. Parei todas as instâncias em execução, executei um docker rmi -f $(docker image ls -q), mas ainda recebi o Error response from daemon: unable to remove volume: remove uuid: volume is in use.

Eu fiz um docker system prunee limpou o que era necessário para remover o último 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

A API do cliente e daemon deve ter pelo menos 1,25 para usar este comando. Use o docker versioncomando no cliente para verificar suas versões da API do cliente e daemon.

Benjamin West
fonte
por alguma razão, tive que fazer isso duas vezes antes de funcionar.
mameluc
1
Eu tive que fazer a "remoção do sistema do docker" e depois "volume do docker rm volume_name". Por alguma razão, remova os contêineres excluídos que eu já havia excluído. confuso .
Matthew Rideout
54

O volume pode estar em uso por um dos contêineres parados. Você pode remover esses contêineres por comando:

docker container prune

então você pode remover volumes não usados

docker volume prune
Ryabchenko Alexander
fonte
1
esta deve ser a resposta aceita, não sei por que pessoas como a resposta dada
Elger Mensonides
9

Desde que os volumes estejam associados a um contêiner (em execução ou não), eles não poderão ser removidos.

Você tem que correr

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

em cada um dos contêineres em execução / inativos em que esse volume pode ter sido montado.

Se o volume estiver montado em qualquer um dos contêineres, você deverá vê-lo na seção Montagens da saída do comando inspecionar . Algo assim :-

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

Depois de descobrir o (s) recipiente (s) responsável (s), use: -

docker rm -f container-1 container-2 ...container-n no caso de contêineres em funcionamento

docker rm container-1 container-2 ...container-n no caso de contêineres sem rodagem

remover completamente os contêineres da máquina host.

Em seguida, tente remover o volume usando o comando: -

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

Supreeth Padavala
fonte
1
Para uma resposta útil, essa reação precisa ser estendida. Adicione informações sobre como verificar isso.
Jeroen Heier
1
Aposto que docker container prunedeve ser suficiente na maioria dos casos.
X-yuri
6

Atualmente, você pode usar o que a janela de encaixe oferece agora para uma limpeza geral e mais completa:

docker system prune

Para remover adicionalmente todos os contêineres parados e todas as imagens não utilizadas (não apenas imagens pendentes), adicione o -asinalizador ao comando:

docker system prune -a
shackra
fonte
3

Tenho certeza de que esses volumes estão realmente montados no seu sistema. Procure em / proc / mounts e você os verá lá. Você provavelmente precisará sudo umount <path>ou sudo umount -f -n <path>. Você deve conseguir o caminho montado em / proc / mounts ou através dedocker volume inspect

Jiri Klouda
fonte
-3

Você deve digitar este comando com o sinalizador -f (force):

sudo docker volume rm -f <VOLUME NAME>

Julia
fonte