Estoy implementando una aplicación de terceros de conformidad con el aviso de 12 factores , y uno de los puntos dice que los registros de la aplicación deben imprimirse en stdout / stderr: luego el software de agrupación puede recopilarlo.
Sin embargo, la aplicación solo puede escribir en archivos o syslog. ¿Cómo imprimo estos registros en su lugar?
Respuestas:
En el archivo Dockerfile de nginx se ofrece una receta increíble :
Simplemente, la aplicación puede continuar escribiéndole como un archivo, pero como resultado las líneas irán a
stdout
&stderr
!fuente
squid3
, y luego tiene problemas con los permisos/dev/stdout
.En otra pregunta, Matar proceso infantil cuando el padre sale , obtuve la respuesta que ayudó a resolver esto.
De esta manera, configuramos la aplicación para que se registre en un archivo y continuamente
tail -f
. Afortunadamente,tail
puede aceptar--pid PID
: saldrá cuando finalice el proceso especificado. Ponemos$$
allí: PID del shell actual.Como paso final, la aplicación iniciada se
exec
edita, lo que significa que el shell actual se reemplaza completamente con esa aplicación.El script del corredor
run.sh
, se verá así:NOTA: al usar
tail -F
, enumeramos los nombres de los archivos, ¡y los leerá incluso si aparecen más tarde!Finalmente, el minimalista Dockerfile:
Nota: para solucionar un
tail -f
comportamiento extremadamente extraño (que dice "ha sido reemplazado por un archivo remoto. Renunciar a este nombre") probé otro enfoque: todos los archivos de registro conocidos se crean y truncan al inicio: de esta manera me aseguro de que existan , y solo entonces - seguirlos:fuente
tail
sin la opción --pid.Para un proceso en segundo plano en un contenedor acoplable, por ejemplo, conectando con exec a / bin / bash pude usar.
Esto envía la salida al stdout de pid 1, que es el que recoge una ventana acoplable.
fuente
docker logs
okubectl logs
. Tengo un contenedor que programa la tarea a través de crontab que no se ejecuta como PID1.para nginx puedes tener
nginx.conf
apuntando/dev/stderr
y/dev/stdout
asíy tu
Dockerfile
entrada debe serfuente
root