yo suelo docker logs [container-name]
para ver los registros de un contenedor específico.
¿Hay alguna forma elegante de borrar estos registros?
yo suelo docker logs [container-name]
para ver los registros de un contenedor específico.
¿Hay alguna forma elegante de borrar estos registros?
Respuestas:
De esta pregunta hay una línea que puedes ejecutar:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
o hay un comando truncado similar:
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 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 :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
También puede configurar esto como parte de su archivo daemon.json en lugar de modificar sus scripts de inicio:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
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í:
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 eso 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 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 .
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 registro
echo -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:
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. ¿Cómo borrar los registros correctamente para un contenedor Docker?
Referencia: truncar un archivo mientras se está utilizando (Linux)
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:
docker logs -f --tail 100
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)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
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
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
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:
LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH
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 la xhyve
VM que sirve como servidor para todos los contenedores de Docker en Docker4Mac. El comando que ejecutamos es el familiar truncate -s0 $LOGPATH
de las respuestas que no son de Mac.
Si está usando docker-compose
, la primera línea se convierte en:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
y <service>
es el nombre del servicio de su docker-compose.yml
archivo.
Gracias a https://github.com/justincormack/nsenter1 por el nsenter
truco.
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.
Como usuario root , intente ejecutar lo siguiente:
> /var/lib/docker/containers/*/*-json.log
o
cat /dev/null > /var/lib/docker/containers/*/*-json.log
o
echo "" > /var/lib/docker/containers/*/*-json.log
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ó:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Prefiero este (de las soluciones anteriores):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
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:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
También puede proporcionar los parámetros log-opts en la docker run
línea de comando, de esta manera:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
o en un docker-compose.yml como este
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Créditos: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
funciona. El 10m
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, ejecutar docker-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
docker exec -it default sh
para ingresar un sh shell en un contenedor. Sin embargo, muchos contenedores no hacen que el sudo
comando esté implícitamente disponible.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"