Backgroud
A culpa pelo problema pode ser dividida entre nossa configuração incorreta dos volumes do contêiner e um problema com o vazamento do docker (falha na liberação) de dados temporários gravados nesses volumes. Devemos mapear (para hospedar pastas ou outras solicitações de armazenamento persistentes) todas as pastas temporárias / logs / scratch do nosso contêiner onde nossos aplicativos gravam com frequência e / ou pesadamente. O Docker não se responsabiliza pela limpeza de todos os chamados EmptyDirs criados automaticamente e localizados por padrão em /var/lib/docker/overlay2/*/diff/*
. O conteúdo dessas pastas "não persistentes" deve ser removido automaticamente pelo docker após o contêiner ser interrompido, mas aparentemente não é (pode ser impossível limpar do lado do host se o contêiner ainda estiver em execução - e pode estar em execução por meses de uma vez).
Gambiarra
Uma solução alternativa requer uma limpeza manual cuidadosa e, embora já tenha sido descrito em outro lugar, você ainda pode encontrar algumas dicas de meu estudo de caso, que tentei tornar o mais instrutivo e generalizável possível.
Então o que aconteceu é que o aplicativo culpado (no meu caso clair-scanner
) conseguiu gravar ao longo de alguns meses centenas de gigs de dados na /diff/tmp
subpasta do dockeroverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Assim, como todas as subpastas /diff/tmp
eram autoexplicativas (todas tinham a mesma forma clair-scanner-*
e datas de criação obsoletas), parei o contêiner associado ( docker stop clair
) e removi cuidadosamente essas subpastas obsoletas diff/tmp
, começando prudentemente com uma única (mais antiga), e testar o impacto no motor do docker (que exigiu reiniciar [ systemctl restart docker
] para recuperar espaço em disco):
rm -rf $(ls -at /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp | grep clair-scanner | tail -1)
Recuperei centenas de GB de espaço em disco sem a necessidade de reinstalar o docker ou limpar suas pastas inteiras. Todos os contêineres em execução tiveram que ser interrompidos em um ponto, porque a reinicialização do daemon do docker foi necessária para recuperar espaço em disco, portanto, certifique-se primeiro de que seus contêineres de failover estejam funcionando corretamente em um / outro nó (s) Eu gostaria que o docker prune
comando pudesse cobrir o obsoleto /diff/tmp
(ou mesmo/diff/*
) também (por meio de outra opção).
É um problema de 3 anos agora, você pode ler sua história rica e colorida nos fóruns do Docker, onde uma variante voltada para logs de aplicativos da solução acima foi proposta em 2019 e parece ter funcionado em várias configurações: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604