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

Si has llegado hasta esta pagina 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 como 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 ultimos 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 roten automaticamente.

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

 

Tags