Erro do Docker: não há espaço no dispositivo

329

Instalei o docker em uma máquina Debian 7 da seguinte maneira

$ echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
$ sudo apt-get update
$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh

Depois disso, quando tentei criar uma imagem, ela falhou com o seguinte erro

 time="2015-06-02T14:26:37-04:00" level=info msg="[8] System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1bdaec2630197fa4da1b19cc3db7e3d3883/cgroup.procs: no space left on device"

Aqui estão as informações do docker

Containers: 2
Images: 21
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 25
Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.16.0-0.bpo.4-amd64
Operating System: Debian GNU/Linux 7 (wheezy)
CPUs: 2
 Total Memory: 15.7 GiB


WARNING: No memory limit support
 WARNING: No swap limit support

Como posso aumentar a memória? Onde estão armazenadas as configurações do sistema?

Das sugestões de Kal:

Quando me livrei de todas as imagens e contêineres, ele liberou algum espaço e a construção da imagem demorou mais tempo antes de falhar com o mesmo erro. Portanto, a pergunta é: a qual espaço isso se refere e como eu o configuro?

user_mda
fonte
1
Às vezes, você pode atingir um limite de tamanho por contêiner , dependendo do back-end de armazenamento. Esse link mostra como corrigi-lo para o devicemapper.
jpaugh
4
Eu tive esse erro quando meu disco estava sem inodes. Verifiquedf -ih
Kevin Smyth
@ KevinSmyth Muito obrigado por apontar isso. Eu nem estava ciente da importância dos limites de inodos antes disso.
precisa saber é o seguinte

Respostas:

337

Eu tive o mesmo erro e resolvo-o desta maneira:

1 Exclua os volumes órfãos no Docker, você pode usar o comando de volume do docker interno. O comando interno também exclui qualquer diretório em / var / lib / docker / volumes que não seja um volume, portanto, certifique-se de não colocar nada lá que você deseja salvar.

Atenção, tenha muito cuidado com isso, se você tiver alguns dados que deseja manter

Limpar:

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

Comandos adicionais:

Listar volumes pendentes:

$ docker volume ls -qf dangling=true

Listar todos os volumes:

$ docker volume ls

2) Considere também remover todas as imagens não utilizadas.

Primeiro, livre-se das <none>imagens (algumas vezes elas são geradas durante a criação de uma imagem e, por qualquer motivo, a construção da imagem foi interrompida, elas permanecem lá).

aqui está um bom script que eu uso para removê-los

docker rmi $(docker images | grep '^<none>' | awk '{print $3}')

Então, se você estiver usando o Docker Compose para criar imagens localmente para cada projeto. Você terá muitas imagens geralmente nomeadas como sua pasta (por exemplo, se a pasta do seu projeto chamada Olá, você encontrará o nome das imagens Hello_blablabla). considere também remover todas essas imagens

você pode editar o script acima para removê-los ou removê-los manualmente com

docker rmi {image-name}

Mahmoud Zalt
fonte
23
Apenas uma observação: os comandos do awk em um Mac devem estar entre aspas simples, não duplas, caso contrário, serão ignorados.
Ndtreviv 31/05
2
Estou no MAC e está funcionando para mim !! Mas obrigado pelo conselho.
Mahmoud Zalt
2
Que estranho! Isso não funciona para mim. Apenas imprime os mesmos resultados que o grep. Ah bem. Coisas estranhas aconteceram.
Ndtreviv
3
Neste ponto, você pode usar o mesmo filtro para imagens. docker images -qf dangling=truee, claro, removê-los com docker rmi $(docker images -qf dangling=true).
Tyler Jones #
3
Eu recebo um erro: "docker volume rm" requer pelo menos 1 argumento (s).
IgorGanapolsky
330

ATUALIZAÇÃO
Os comandos abaixo se tornaram hacks à medida que o Docker se torna mais desenvolvido. A melhor prática atual é

docker system prune

Isso removerá:

- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images

Como abaixo, isso é nuclear.


Para limpar seu sistema, primeiro remova os contêineres

$ docker rm $(docker ps -aq)

depois remova as imagens

$ docker rmi $(docker images -q)

Naturalmente, isso é nuclear e removerá todos os contêineres e todas as imagens. Você pode removê-los um de cada vez via docker rm #CONTAINER_ID#e docker rmi #IMAGE_ID.

Joshua Cook
fonte
2
como Kevin Smyth apontou, esse erro provavelmente ocorre devido à falta de inodes que você pode ver df -ih. Para diagnosticar mais cirurgicamente, digite ncdue pressione c para contagem de arquivos e C para classificar por contagem de arquivos para obter uma estimativa aproximada do que está usando todos os seus inodes. Se o problema for realmente o Docker, será imediatamente aparente pelos diretórios que usam mais inodes.
precisa saber é o seguinte
2
Realmente, isso deve ser votado e respondido, pois é a abordagem correta. O ambiente para a construção ficou poluído e agora cortar aqui e ali pode correção temporária, mas a abordagem adequada deve serdocker system prune
zhrist
@zhrist Haha Eu concordo
Joshua Cook
@ coler-j Talvez ... se você está pensando em termos da pergunta original altamente específica. Mas sejamos honestos um com o outro. A maioria das pessoas não está encontrando essa pergunta por causa dos casos de uso obscuros dos OPs, mas porque o cache do docker simplesmente ficou sem espaço.
Joshua Cook
@ JoshuaCook, na verdade, é um problema muito comum: github.com/docker/for-win/issues/1042 sem uma solução real. Apenas tentando obter a causa raiz e é muito frustrante. :(
coler-j
70

Verifique se você tem espaço livre em / var, pois é nesse local que o Docker armazena os arquivos de imagem por padrão (em / var / lib / docker).

Primeiro limpe as coisas usando docker ps -apara listar todos os contêineres (incluindo os interrompidos) e docker rmremovê-los; use docker imagespara listar todas as imagens armazenadas e docker rmiremovê-las.

Em seguida, altere o local de armazenamento com uma opção -g no daemon do docker ou editando /etc/default/dockere adicionando a -gopção a DOCKER_OPTS. -gespecifica o local do "Docker runtime", que é basicamente tudo o que o Docker cria ao criar imagens e executar contêineres. Escolha um local com bastante espaço, pois o espaço em disco usado tenderá a aumentar com o tempo. Se você editar /etc/default/docker, será necessário reiniciar o daemon do docker para que a alteração entre em vigor.

Agora você poderá criar uma nova imagem (ou extrair uma do Docker Hub) e verá vários arquivos sendo criados no diretório especificado com a opção -g.

Kal
fonte
Obrigado Kal, não foi possível encontrar a documentação em DOCKER_OPTS. O que significa a opção -g e o que deve ser configurada? Também podem ser excluídos os itens em docker / aufs / mnt?
user_mda
Ei, ruby, acho que nunca encontrei um documento real sobre DOCKER_OPTS, mas há lugares aqui e ali na documentação que falam sobre editá-lo. O mais próximo que posso encontrar é no final de docs.docker.com/installation/ubuntulinux/…, onde ele fala sobre a edição das configurações de DNS em DOCKER_OPTS. As opções em DOCKER_OPTS são passadas apenas para o daemon, portanto, a referência é docs.docker.com/reference/commandline/cli/#daemon . -g define o local base do "tempo de execução Docker"
Kal
Também podem ser excluídos os itens em docker / aufs / mnt?
user_mda
Não exclua essas coisas manualmente. Em vez disso, exclua todos os contêineres (incluindo os existentes) e as imagens que você não precisa. Você deve fazer isso antes de alterar a opção -g. Use docker ps -apara listar todos os contêineres (incluindo os existentes) e depois docker rmpara removê-los. Use docker imagespara listar todas as imagens e depois docker rmiremovê-las. Espero que isso limpe tudo (ou quase tudo).
Kal
Obrigado, por isso, limpar as imagens e os contêineres liberou algum espaço. No entanto, para que o tempo de execução do docker deveria estar apontando ?, existe uma maneira de aumentar apenas o espaço usado pelo docker para armazenar imagens?
user_mda
38

Como já mencionado,

docker system prune

ajuda, mas com o Docker 17.06.1 e posterior sem remover volumes não utilizados. Desde o Docker 17.06.1, o comando a seguir também remove os volumes:

docker system prune --volumes

Na documentação do Docker: https://docs.docker.com/config/pruning/

O comando de remoção do sistema do docker é um atalho que remove imagens, contêineres e redes. No Docker 17.06.0 e versões anteriores, os volumes também são removidos. No Docker 17.06.1 e superior, você deve especificar o sinalizador --volumes para que o sistema do docker possa remover volumes.

Se você deseja remover volumes e manter imagens e contêineres:

docker volume prune
RoBeaToZ
fonte
3
docker volume pruneme ajudou hoje quando todas as outras soluções aqui pararam de funcionar.
AVProgrammer 9/08/19
1
Ajuda enorme - além de corrigir o erro, isso liberou muitos shows de espaço no meu disco rígido.
Matt Browne
29

Se for apenas uma instalação de teste do Docker (ou seja, não produção) e você não se importar em fazer uma limpeza nuclear, você pode:

limpe todos os recipientes: docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm

limpe todas as imagens: docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

Novamente, eu uso isso em minhas instâncias ec2 ao desenvolver o Docker, não em nenhum caminho sério de controle de qualidade ou produção. O melhor é que, se você possui seus arquivos do Docker, é fácil reconstruir e ou docker pull.

James
fonte
1
Na minha instância do boot2docker, tive que ligar docker images -a | sed '1 d' | awk '{print $3}' | xargs docker rmi -f. A versão do OS X BSD xargssuporta a -Lopção, diferente da versão do boot2docker.
orluke
1
Você pode usar docker ps -a -qetc., para evitar as manipulações de texto, ou seja, docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q)deve fazer o truque
Niklas B.
21

para remover todos os contêineres, volumes, redes e imagens não utilizados de uma só vez ( https://docs.docker.com/engine/reference/commandline/system_prune/#related-commands ):

docker system prune -a -f --volumes

se não for suficiente, pode-se remover os contêineres em execução primeiro:

docker rm -f $(docker ps -a -q)
docker system prune -a -f --volumes

aumentar / var / lib / docker ou usar outro local com mais espaço também é uma boa alternativa para se livrar desse erro (consulte Como alterar o diretório de instalação da imagem do docker? )

Guillaume
fonte
docker system prunenão remove volumes.
Bonifacio2
1
docker system prune -a -f --volumesirá remover volumes.
Jimson Kannanthara James
19

Docker para Mac

Então, docker system prunee docker system prune --volumessugerido em outras respostas liberava algum espaço a cada vez, mas eventualmente, toda vez que eu executava qualquer coisa, estava recebendo o erro.

O que realmente corrigiu o problema raiz foi excluir o Docker.rawarquivo que o Docker for Mac usa para armazenamento e reiniciá-lo.

Para encontrar esse arquivo, abra o Docker for Mac e vá para *

Preferences > Resources > Advanced > Disk Image Location

* isto é para a versão 2.2.0.5, mas nas versões mais antigas deve ser semelhante

Nas versões mais recentes do Docker for Mac **, ele mostra o tamanho real desse arquivo no disco ali na interface do usuário, bem como o tamanho máximo alocado. Você provavelmente verá que é enorme. Por exemplo, na minha máquina, eram 41 GB !

** Nas versões anteriores, ele não mostra o uso real do disco na interface do usuário, e o MacOS Finder sempre mostra o tamanho do arquivo como o tamanho máximo alocado. Você pode verificar o tamanho real no disco, abrindo o diretório em um terminal e executandodu -h Docker.raw

Excluí Docker.raw, reiniciei o Docker for Mac e o arquivo foi criado automaticamente novamente e voltou a ter 0 GB .

Tudo continuou funcionando como antes , embora, é claro, eu tivesse perdido meu cache do Docker. Como esperado, após executar alguns comandos do Docker, o arquivo começou a ser preenchido novamente com alguns GB de material, mas nem perto de 41 GB .


Atualizar

Alguns meses depois, eu Docker.rawvoltei a um tamanho semelhante. Portanto, esse método funcionou, mas deve ser repetido a cada poucos meses. Para mim tudo bem.

Uma observação sobre por que isso funciona - devo assumir que é um bug no Docker for Mac. Parece realmente que docker system prune/ docker system prune --volumesdeve limpar completamente o conteúdo deste arquivo, mas parece que o arquivo acumula outras coisas que não podem ser excluídas por esses comandos. De qualquer forma, excluí-lo manualmente resolve o problema!

davnicwil
fonte
15

O Docker deixa imagens pendentes ao redor que podem ocupar seu espaço. Para limpar após o Docker, execute o seguinte:

docker image prune [-af if you want to force remove all images]

ou com versões mais antigas do Docker:

docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")

Isso removerá imagens penduradas e danificadas, o que, esperançosamente, libera espaço no dispositivo.

punkrockpolly
fonte
14
  1. Limpar imagens danificadas docker rmi $(docker images -f "dangling=true" -q)
  2. Remova volumes indesejados
  3. Remova imagens não utilizadas
  4. Remova os recipientes não utilizados
josepainumkal
fonte
Para mim, o problema era ter muitas imagens. Depois de limpá-los, a janela de encaixe funciona novamente.
Tran Triet
9

você também pode usar:

docker system prune

ou apenas para volumes:

docker volume prune
alexanoid
fonte
7

No meu caso, a instalação do ubuntu-server 18.04.1 [por algum motivo estranho] criou um volume lógico do LVM com apenas 4 GB de tamanho em vez de 750 GB. Portanto, ao puxar imagens, eu receberia esse erro "sem espaço restante no dispositivo". A correção é simples:

lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
Kostyantyn
fonte
.. ver a minha descrição passo-a-passo para resize2fs na seguinte discussão: stackoverflow.com/questions/32485723/...
Alex
7

Eu também encontrei esse problema na máquina RHEL. Não encontrei nenhuma solução apt em lugar algum na comunidade stack-overflow e docker-hub. Se você estiver enfrentando esse problema mesmo depois do comando abaixo:

poda do sistema docker --todos

A solução que funcionou finalmente:

  1. informações do docker
    • Para verificar o driver de armazenamento da janela de encaixe atual
    • O meu era: Driver de armazenamento: devicemapper; Se você tiver um driver de armazenamento como overlay2, não se preocupe. A solução ainda funcionará para você.
  2. df -h
    • Isso é para verificar os sistemas de arquivos disponíveis na máquina e o caminho em que eles estão montados. Caminho montado dois para obter uma nota:
    • / dev / mapper / rootvg-var 7.6G 1.2G 6.1G 16% / var
    • / dev / mapper / rootvg-apps 60G 9,2G 48G 17% / aplicativos
    • Nota - Por padrão, o caminho do armazenamento do docker é / var / lib / docker. Tem espaço disponível ~ 6 GB e, portanto, todos os problemas relacionados ao espaço. Então, basicamente, eu tenho que mover o armazenamento padrão para outro armazenamento em que o espaço disponível é maior. Para mim, o caminho do sysyem do arquivo '/ dev / mapper / rootvg-apps', montado em / apps. Agora, a tarefa é mover / var / lib / docker para algo como / apps / newdocker / docker.
  3. mkdir / apps / newdocker / docker
  4. chmod -R 777 / apps / newdocker / docker
  5. Atualize o arquivo docker.serive no linux, que reside em: / usr / lib / systemd / system
    • vi /usr/lib/systemd/system/docker.service
  6. se o dispositivo de armazenamento for devicemapper, comente a linha ExecStart existente e adicione abaixo em [Serviço]:
    • ExecStart =
    • ExecStart = / usr / bin / dockerd -s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.basesize = 40GB -g / apps / newdocker / docker --exec-opt native.cgroupdriver = cgroupfs
  7. Ou se o dispositivo de armazenamento estiver sobreposto2:
    • basta adicionar -g / apps / newdocker / docker na instrução ExexStart existente.
    • Algo como ExecStart = / usr / bin / dockerd -g / apps / newdocker / docker -H fd: // --containerd = / run / containserd / containserd.sock
  8. rm -rf / var / lib / docker (Exclui todos os dados existentes do docker)
  9. systemctl stop docker
  10. ps aux | docker grep -i | grep -v grep
    • Se nenhuma saída foi produzida pelo comando acima, recarregue o systemd daemon pelo comando abaixo.
  11. systemctl daemon-reload
  12. docker inicial do systemctl
  13. informações do docker
    • Confira o Espaço de dados disponível: 62,15 GB após o encaixe no docker para o novo sistema de arquivos.
  14. FEITO
Mayank Chaudhary
fonte
Eu tenho procurado em toda a documentação sobre como conseguir isso! Obrigado senhor. Podemos marcar isso como uma das respostas?
Vulegend 06/06
6

Limpe o Docker usando o seguinte comando:

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi
Ashok Waghmare
fonte
4

Seus cgroups têm o cpusetcontrolador ativado. Este controlador é útil principalmente no ambiente NUMA, onde permite especificar com precisão qual banco de CPU / memória suas tarefas podem executar.

Por padrão, o obrigatório cpuset.memse cpuset.cpusnão está definido, o que significa que "não resta espaço" para a sua tarefa, daí o erro.

A maneira mais fácil de corrigir isso é habilitar cgroup.clone_children1 no cgroup raiz. No seu caso, deve ser

echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children

Basicamente, ele instruirá o sistema a inicializar automaticamente o contêiner cpuset.memse a cpuset.cpuspartir de seu cgroup pai.

yadutaf
fonte
1
Essa é a resposta correta. Simplesmente atualizar o Docker para qualquer coisa> = Docker 1.8 deve resolvê-lo. Isto está relacionado com github.com/opencontainers/runc/issues/133 da questão, um outro potencial de trabalho-around é"echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
cpuguy83
2

Se você estiver usando a imagem boot2docker através do Docker Toolkit, o problema decorre do fato de a máquina virtual boot2docker ficar sem espaço.

Quando você faz docker importou adiciona uma nova imagem, a imagem é copiada para a /mnt/sda1que pode ter ficado cheia.

Uma maneira de verificar qual espaço você tem disponível na imagem é ssh na vm, executar df -he verificar o espaço restante em / mnt / sda1

O comando ssh é docker-machine ssh default

Depois de ter certeza de que é realmente um problema de espaço, você pode limpar de acordo com as instruções em algumas das respostas desta pergunta ou optar por redimensionar a própria imagem do boot2docker, aumentando o espaço em /mnt/sda1

Você pode seguir as instruções aqui para redimensionar a imagem https://gist.github.com/joost/a7cfa7b741d9d39c1307

Nerrve
fonte
2

Se você estiver usando o Docker Desktop, poderá aumentar o tamanho da imagem do Disco nas Configurações avançadas , acessando as Preferências do Docker .

Aqui está a captura de tela do macOS:

Docker Desktop no macOS, Recursos, Avançado, Tamanho da imagem do disco

kenorb
fonte
1

Pode ser devido ao espaço de armazenamento padrão definido para 40 GB (caminho padrão, / var / lib / docker)

você pode alterar o volume de armazenamento para apontar para um caminho diferente

  • editar arquivo -> / etc / sysconfig / docker-storage
  • atualização abaixo da linha (adicione se não existir)

DOCKER_STORAGE_OPTIONS = '- driver de armazenamento = sobreposição --graph = CUSTOM_PATH'

  • Reinicie o docker systemctl parar o docker systemctl daemon-reload systemctl start docker

se você executar informações da janela de encaixe do comando (deve mostrar o driver de armazenamento como sobreposição)

Ajit Ganiger
fonte
0

Parece que existem algumas maneiras de isso ocorrer. O problema que tive foi que a imagem do disco do docker atingiu seu tamanho máximo (Docker Whale -> Preferences -> Disk se você deseja visualizar qual o tamanho do OSX).

Aumentei o limite e estava pronto. Tenho certeza de que limpar imagens não utilizadas também funcionaria.

SnellyBigoda
fonte
0

Eu executo os comandos abaixo.

Não há necessidade de reconstruir as imagens posteriormente.

docker rm $(docker ps -qf 'status=exited')
docker rmi $(docker images -qf "dangling=true")
docker volume rm $(docker volume ls -qf dangling=true)

Eles removem contêineres / volumes pendentes / pendentes.

M3RS
fonte
0

Para mim, docker system prunefiz o truque. Estou executando o Mac OS.

Bildad N. Urandu
fonte
Isso realmente funcionou no meu também, quando eu estava tentando limpar o espaço usado no Mac OS. o uso do comando docker volume lsnão retornava nada, portanto parecia que o armazenamento era usado principalmente por caches e imagens pendentes.
Tuhin
-3
$ docker rm $(docker ps -aq)

Isso funcionou para mim

docker system prune 

parece ser a melhor opção com a versão mais recente

htnawsaj
fonte