Cómo reducir el tamaño de archivos de log de los contenedores Docker

Si has llegado hasta esta página es porque te has dado cuenta que tus logs son muy grandes y que ocupan más espacio del que deseas.

Detectar exactamente el tamaño

El siguiente comando muestra el tamaño de cada uno de los logs de tus contenedores docker.

docker ps -aq | xargs -I'{}' docker inspect --format='{{.LogPath}}' '{}' | xargs ls -lh

Esto devolvería algo similar a:

-rw-r----- 1 root root  34K 2017-06-08  /var/lib/docker/containers/3uy7mfiybwnaakfgstokw6h5kmsrzbhmeay9lssnm39v8y5ngf6yz7amd3i8kjhj/3uy7mfiybwnaakfgstokw6h5kmsrzbhmeay9lssnm39v8y5ngf6yz7amd3i8kjhj-json.log
-rw-r----- 1 root root 276K 2018-04-16  /var/lib/docker/containers/q51e1h6e3y4uproc0u4qq8bvighswuzhqi1jzw49ucqarsbcftfdcpa26ls02bxo/q51e1h6e3y4uproc0u4qq8bvighswuzhqi1jzw49ucqarsbcftfdcpa26ls02bxo-json.log
-rw-r----- 1 root root 4,2M 2019-03-21  /var/lib/docker/containers/l3m2ioyd1fapcy1a8wro1b4cx877b3f0ikujem8x8xlxon0t4sjs1xkdqh2eona8/l3m2ioyd1fapcy1a8wro1b4cx877b3f0ikujem8x8xlxon0t4sjs1xkdqh2eona8-json.log
-rw-r----- 1 root root 7,2M 2019-03-21  /var/lib/docker/containers/lbq2x85gdwdj2gkmv9qfnk0axdewr790huhdq0ojksiuxxhfsp8y8q4bpj4ri5t4/lbq2x85gdwdj2gkmv9qfnk0axdewr790huhdq0ojksiuxxhfsp8y8q4bpj4ri5t4-json.log
-rw-r----- 1 root root 1,3M 01-10 12:19 /var/lib/docker/containers/mkvqklyhft8nr6gwfzkccayl9nlpnfspxmc0gqd9d1c4mgilj5muzoxluwkf9eav/mkvqklyhft8nr6gwfzkccayl9nlpnfspxmc0gqd9d1c4mgilj5muzoxluwkf9eav-json.log
-rw-r----- 1 root root 131G 01-11 18:19 /var/lib/docker/containers/nol87bct8i1pd0ya6pg1m3iva0cpgdde6khm0vym0g0jlob1jd3gcgbwm1scfpyg/nol87bct8i1pd0ya6pg1m3iva0cpgdde6khm0vym0g0jlob1jd3gcgbwm1scfpyg-json.log

En este ejemplo vemos que hay un fichero de 131G. Lo cual es una locura!!

Ahora vamos a eliminar esos logs que sabemos que están mal.

Puede ser recomendable hacer un backup comprimiendo los datos antes (depende de cómo de importantes sean los logs para ti):

sudo cat /var/lib/docker/containers/nol87bct8i1pd0ya6pg1m3iva0cpgdde6khm0vym0g0jlob1jd3gcgbwm1scfpyg/nol87bct8i1pd0ya6pg1m3iva0cpgdde6khm0vym0g0jlob1jd3gcgbwm1scfpyg-json.log | bzip2 --best --compress --stdout > /mnt/nfs-shared/temp/c12a851-12.01.2019.log.bz2

Eliminar los logs

Primero vamos a instalar util-linux. Puede ser que ya lo tengas instalado, pero por si acaso:

sudo apt-get install util-linux

Para eliminar los logs vamos a usar fallocate. Concretamente vamos a eliminar los primeros 130G del fichero de 131G. Por tanto vamos a dejar el fichero con los últimos logs.

sudo fallocate --collapse-range --offset 0 --length 130GiB --verbose /var/lib/docker/containers/nol87bct8i1pd0ya6pg1m3iva0cpgdde6khm0vym0g0jlob1jd3gcgbwm1scfpyg/nol87bct8i1pd0ya6pg1m3iva0cpgdde6khm0vym0g0jlob1jd3gcgbwm1scfpyg-json.log

Creo que no hace falta explicar mucho. Has de modificar el valor 130GiB por el tamaño que quieres eliminar, y has de modificar la ruta del fichero con la de tu fichero.

Puedes comprobar el nuevo tamaño del fichero si vuelves a ejecutar el comando para ver el peso. En este ejemplo devuelve que ahora el peso es de 0,7G

Solución permanente

Se ha de configurar docker para que los logs no consuman un espacio excesivo en el disco. Y que se rotan automáticamente.

Esto se puede conseguir especificando el logging en cada uno de los contenedores de tu fichero docker-compose.yml

logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

O mi preferida, especificar esta configuración como por defecto para todos los dockers:

echo '{"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}}' | jq . > /etc/docker/daemon.json \
  && systemctl restart docker

Otra forma de limpiar todos los logs de docker

Si lo que quieres es limpiar de golpe todos los logs de todos los docker, esto se puede hacer con el siguiente comando:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

No es una cosa que recomiende mucho, pero a veces algún log se queda corrupto, no sabes cual es y solo te queda como opción rápida vaciar todos los logs de los docker.

¿Tienes algún proyecto en mente?

Si quieres hacer algo en Drupal tal vez puedas contratarme.

Ya sea para consultoría, desarrollo o mantenimiento de sitios web Drupal.