Fondo
La culpa del problema se puede dividir entre nuestra mala configuración de los volúmenes de contenedores y un problema con la ventana acoplable que filtra (no se libera) los datos temporales escritos en estos volúmenes. Deberíamos estar mapeando (ya sea a carpetas de alojamiento u otras reclamaciones de almacenamiento persistentes) todas las carpetas temporales / registros / temporales del contenedor donde nuestras aplicaciones escriben con frecuencia y / o mucho. Docker no asume la responsabilidad de la limpieza de todos los llamados EmptyDirs creados automáticamente ubicados por defecto en/var/lib/docker/overlay2/*/diff/*
. El contenido de estas carpetas "no persistentes" debe ser purgado automáticamente por la ventana acoplable después de que se detenga el contenedor, pero aparentemente no es así (pueden ser incluso imposibles de purgar desde el lado del host si el contenedor aún se está ejecutando, y puede estar ejecutándose durante meses a la vez).
Solución alterna
Una solución requiere una limpieza manual cuidadosa y, aunque ya se describió en otra parte, aún puede encontrar algunas sugerencias de mi estudio de caso, que traté de hacer lo más instructivo y generalizable posible.
Entonces, lo que sucedió es que la aplicación culpable (en mi caso clair-scanner
) logró escribir durante unos meses cientos de gigas de datos en la /diff/tmp
subcarpeta de docker'soverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Entonces, como todas esas subcarpetas en /diff/tmp
eran bastante autoexplicativas (todas tenían el formulario clair-scanner-*
y tenían fechas de creación obsoletas), detuve el contenedor asociado ( docker stop clair
) y eliminé cuidadosamente estas subcarpetas obsoletas diff/tmp
, comenzando prudentemente con una sola (la más antigua), y probando el impacto en el motor de la ventana acoplable (que requirió reiniciar [ systemctl restart docker
] para recuperar espacio en 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)
Recuperé cientos de gigas de espacio en disco sin la necesidad de volver a instalar la ventana acoplable o purgar todas sus carpetas. Todos los contenedores en ejecución tenían que detenerse en un momento dado, porque se requería el reinicio del demonio de la ventana acoplable para recuperar espacio en el disco, así que asegúrese primero de que sus contenedores de conmutación por error se estén ejecutando correctamente en otro / otro nodo / s). Sin embargo, me gustaría que el docker prune
comando pudiera cubrir los datos obsoletos /diff/tmp
(o incluso /diff/*
) también (a través de otro interruptor).
Es un problema de 3 años ahora, puede leer su rica y colorida historia en los foros de Docker, donde se propuso una variante destinada a los registros de aplicaciones de la solución anterior en 2019 y parece haber funcionado en varias configuraciones: https: // foros.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604