Tengo un contenedor docker ejecutándose en una pequeña instancia de AWS con espacio en disco limitado. Los registros eran cada vez más grandes, así que usé los siguientes comandos para eliminar los archivos de registro cada vez mayores:
sudo -s -H find /var -name "*json.log" | grep docker | xargs -r rm journalctl --vacuum-size=50M Ahora quiero ver cuál es el comportamiento de uno de los contenedores docker en ejecución, pero afirma que el archivo de registro ha desaparecido (del comando rm anterior):
ubuntu@xyz:~$ docker logs --follow name_of_running_docker_1 error from daemon in stream: Error grabbing logs: open /var/lib/docker/containers/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3-json.log: no such file or directoryMe gustaría poder ver de nuevo lo que sucede en el contenedor en ejecución, así que probé:
sudo touch /var/lib/docker/containers/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3-json.log Y nuevamente docker follow , pero al interactuar con el software que debería producir registros, puedo ver que no sucede nada.
¿Hay alguna forma de rescatar la impresión en el archivo de registro nuevamente sin eliminar (reiniciar) los contenedores?
¿Hay alguna forma de rescatar la impresión en el archivo de registro nuevamente sin eliminar (reiniciar) los contenedores?
Sí, pero es más un truco que una solución real. Nunca debe interactuar con los datos de /var/lib/docker directamente . Segúnlos documentos de Docker :
parte del sistema de archivos host [que] es administrado por Docker (
/var/lib/docker/volumes/en Linux). Los procesos que no son de Docker no deben modificar esta parte del sistema de archivos.
Para que este truco funcione, debe configurar su Docker Daemon para mantener activos los contenedores durante el tiempo de inactividad antes de ejecutar nuestro contenedor por primera vez. Por ejemplo, configurando su /etc/docker/daemon.json con:
{ "live-restore": true } Esto requiere el reinicio de Daemon, como sudo systemctl restart docker .
Luego cree un contenedor y elimine su archivo .log :
$ docker run --name myhttpd -d httpd:alpine $ sudo rm $(docker inspect myhttpd -f '{{ .LogPath }}') # Docker is not happy $ docker logs myhttpd error from daemon in stream: Error grabbing logs: open /var/lib/docker/containers/xxx-json.log: no such file or directoryReinicie Daemon (con restauración en vivo), esto hará que Docker vuelva a tomar la administración de nuestro contenedor y vuelva a crear nuestro archivo de registro. Sin embargo, los registros generados antes de la eliminación del archivo de registro se pierden.
$ sudo systemctl restart docker $ docker logs myhttpd # works! and log file is created back Nota: esta no es una característica documentada u oficial de Docker, simplemente un comportamiento que observé con mis propios experimentos usando Docker 19.03 . Puede que no funcione con otras versiones de Docker
Con la restauración en vivo habilitada, nuestro proceso de contenedor sigue ejecutándose aunque Docker Daemon esté detenido. En el reinicio del demonio Docker, probablemente de alguna manera intente volver a leer desde el proceso aún vivo stdout y stderr y redirigir la salida a nuestro archivo de registro (por lo tanto, volver a crearlo)