Docker: ¿Cómo borrar los registros correctamente para un contenedor Docker?
Solía docker logs [container-name]
ver los registros de un contenedor específico.
¿Existe una forma elegante de borrar estos registros?
Primero la mala respuesta. De esta pregunta hay una línea que puede ejecutar:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
en lugar de eco, existe el más simple:
: > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
o está el comando truncar:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
No soy un gran admirador de ninguno de ellos, ya que modifican los archivos de Docker directamente. La eliminación del registro externo podría ocurrir mientras Docker escribe datos con formato json en el archivo, lo que genera una línea parcial y anula la capacidad de leer cualquier registro de la docker logs
CLI. Para ver un ejemplo de lo que sucede, vea este comentario sobre la respuesta de duketwo :
Después de vaciar el archivo de registro, aparece este error:
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
En su lugar, puede hacer que Docker rote automáticamente los registros por usted. Esto se hace con indicadores adicionales en Dockerd si está utilizando el controlador de registro JSON predeterminado :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
También puedes configurar esto como parte de tu archivo daemon.json en lugar de modificar tus scripts de inicio:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Estas opciones deben configurarse con acceso de root. Asegúrese de ejecutar a systemctl reload docker
después de cambiar este archivo para aplicar la configuración. Esta configuración será la predeterminada para cualquier contenedor recién creado. Tenga en cuenta que los contenedores existentes deben eliminarse y volverse a crear para recibir los nuevos límites de registro.
Se pueden pasar opciones de registro similares a contenedores individuales para anular estos valores predeterminados, lo que le permite guardar más o menos registros en contenedores individuales. De docker run
esto se ve así:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
o en un archivo de redacción:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Para ahorrar espacio adicional, puede cambiar del controlador de registro json al controlador de registro "local". Toma las mismas opciones de tamaño máximo y archivo máximo, pero en lugar de almacenar en json usa una sintaxis binaria que es más rápida y más pequeña. Esto le permite almacenar más registros en el mismo archivo de tamaño. La entrada daemon.json para esto se ve así:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
La desventaja del controlador local es que los analizadores/reenviadores de registros externos que dependían del acceso directo a los registros json ya no funcionarán. Entonces, si usa una herramienta como filebeat para enviar a Elastic o el reenviador universal de Splunk, evitaría el controlador "local".
Tengo un poco más sobre esto en mi presentación de Consejos y trucos .
Usar:
truncate -s 0 /var/lib/docker/containers/**/*-json.log
Puede que necesites sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/**/*-json.log"
árbitro. Jeff S. Docker: ¿Cómo borrar correctamente los registros de un contenedor Docker?
Referencia: Truncar un archivo mientras se usa (Linux)
En Docker para Windows y Mac, y probablemente también en otros, es posible utilizar la opción tail. Por ejemplo:
docker logs -f --tail 100
De esta manera, solo se muestran las últimas 100 líneas y no es necesario desplazarse primero por 1 millón de líneas...
(Y por lo tanto, eliminar el registro probablemente no sea necesario)