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,tailpuede aceptar--pid PID: saldrá cuando finalice el proceso especificado. Ponemos$$allí: PID del shell actual.Como paso final, la aplicación iniciada se
execedita, 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 -fcomportamiento 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
tailsin 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 logsokubectl logs. Tengo un contenedor que programa la tarea a través de crontab que no se ejecuta como PID1.para nginx puedes tener
nginx.confapuntando/dev/stderry/dev/stdoutasíy tu
Dockerfileentrada debe serfuente
root