yo suelo docker logs [container-name]
para ver los registros de un contenedor específico.
¿Hay alguna forma elegante de borrar estos registros?
docker
docker-compose
boot2docker
docker-machine
Youssouf Maiga
fuente
fuente
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Respuestas:
De esta pregunta hay una línea que puedes ejecutar:
o hay un comando truncado similar:
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 está escribiendo datos con formato json en el archivo, lo que da como resultado una línea parcial y rompe la capacidad de leer cualquier registro desde el
docker logs
cli.En cambio, puede hacer que Docker gire automáticamente los registros por usted. Esto se hace con indicadores adicionales para dockerd si está utilizando el controlador de registro JSON predeterminado :
También puede configurar esto como parte de su archivo daemon.json en lugar de modificar sus scripts de inicio:
Estas opciones deben configurarse con acceso root. Asegúrese de ejecutar un
systemctl reload docker
después de cambiar este archivo para que se aplique 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 recrearse 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í:o en un archivo de redacción:
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 eso se ve así:
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 al reenviador universal de Splunk, evitaría el controlador "local".
Tengo un poco más de esto en mi presentación de Consejos y trucos .
fuente
service docker restart
que por sí sola no funcionó. También tuve que crear nuevos contenedores antes de que entrara en vigencia. es decir, simplemente al abrir los contenedores antiguos no se aplicó el nuevo registroecho -n > ...
. De todos modos, me gustaría poder tener más control sobre mis registros. Por ejemplo, después de reiniciar Docker-compose , me encantaría tener el mecanismo para hacer algo con los registros conservados.Utilizar:
Puede que necesites sudo
árbitro. Jeff S. ¿Cómo borrar los registros correctamente para un contenedor Docker?
Referencia: truncar un archivo mientras se está utilizando (Linux)
fuente
containers
no está disponible de otra manera.sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- trabajó para míerror from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
En Docker para Windows y Mac, y probablemente también en otros, es posible usar la opción de cola. Por ejemplo:
De esta forma, solo se muestran las últimas 100 líneas, y no tiene que desplazarse primero por las líneas 1M ...
(Y por lo tanto, eliminar el registro es probablemente innecesario)
fuente
fuente
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, para obtener solo el total del tamaño de los registrossudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Puede configurar logrotate para borrar los registros periódicamente.
Archivo de ejemplo en /etc/logrotate.d/docker-logs
fuente
docker run
? el archivo/etc/logrotate.d/docker-logs
no existe, tengo que crearlo?"log-opts"
como lo muestra BMitch)Docker4Mac, una solución 2018:
La primera línea obtiene la ruta del archivo de registro, similar a la respuesta aceptada.
La segunda línea utiliza
nsenter
eso le permite ejecutar comandos en laxhyve
VM que sirve como servidor para todos los contenedores de Docker en Docker4Mac. El comando que ejecutamos es el familiartruncate -s0 $LOGPATH
de las respuestas que no son de Mac.Si está usando
docker-compose
, la primera línea se convierte en:y
<service>
es el nombre del servicio de sudocker-compose.yml
archivo.Gracias a https://github.com/justincormack/nsenter1 por el
nsenter
truco.fuente
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
No puede hacer esto directamente a través de un comando Docker.
Puede limitar el tamaño del registro o usar un script para eliminar registros relacionados con un contenedor. Puede encontrar ejemplos de scripts aquí (leer desde abajo): Característica: Capacidad para borrar el historial de registro # 1083
Consulte la sección de registro de la referencia del archivo docker-compose, donde puede especificar opciones (como rotación de registro y límite de tamaño de registro) para algunos controladores de registro.
fuente
Como usuario root , intente ejecutar lo siguiente:
o
o
fuente
En mis servidores Ubuntu, incluso como sudo, obtendría
Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Pero peinar el docker inspeccionar y truncar respuestas funcionó:
fuente
Prefiero este (de las soluciones anteriores):
Sin embargo, estoy ejecutando varios sistemas (Ubuntu 18.x Bionic, por ejemplo), donde esta ruta no funciona como se esperaba. Docker se instala a través de Snap, por lo que la ruta a los contenedores se parece más a:
fuente
También puede proporcionar los parámetros log-opts en la
docker run
línea de comando, de esta manera:o en un docker-compose.yml como este
Créditos: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
fuente
"5"
y"10m"
respectivamente), como se muestra aquí para el archivo global daemon.json, pero es lo mismo para un docker-compose.yml. En ambos casos, solo afectará a los contenedores recién creados."5"
funciona. El10m
trabajo sin citar de hecho.Docker para usuarios de Mac, aquí está la solución:
Encuentre la ruta del archivo de registro por:
$ docker inspect | grep log
SSH en la máquina acoplable (supongamos que el nombre es
default
, si no, ejecutardocker-machine ls
para averiguarlo):$ docker-machine ssh default
Cambiar a usuario root ( referencia ):
$ sudo -i
Eliminar el contenido del archivo de registro:
$ echo "" > log_file_path_from_step1
fuente
docker exec -it default sh
para ingresar un sh shell en un contenedor. Sin embargo, muchos contenedores no hacen que elsudo
comando esté implícitamente disponible.