Estoy implementando una aplicación de terceros de acuerdo con el asesoramiento de 12 factores, y uno de los puntos indica que los registros de la aplicación deben imprimirse en stdout/stderr: entonces el software de agrupación en clústeres puede recopilarlos.
Sin embargo, la aplicación solo puede escribir en archivos o syslog. ¿Cómo imprimo estos registros en su lugar?
De esta forma, configuramos la aplicación para que se registre en un archivo y de forma continua tail -f se. Afortunadamente, tail puede aceptar --pid PID: se cerrará cuando salga el proceso especificado. Ponemos $$ allí: PID del shell actual.
Como paso final, la aplicación lanzada es exec'ed, lo que significa que el shell actual se reemplaza por completo con esa aplicación.
NOTA: al usar tail -F enumeramos los nombres de los archivos, y los leerá incluso si aparecen más tarde.
Finalmente, el minimalista Dockerfile:
FROM ubuntuADD run.sh /root/run.shCMD ['/root/run.sh']
Nota: para solucionar algunos problemas extremadamente extraños tail -f comportamiento (que dice "ha sido reemplazado por un archivo remoto. renunciando 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 them los sigo:
Solo tuve que resolver este problema con apache2 y luché con el uso de CustomLog para intentar redirigir a /proc/1/fd/1 pero no pude hacer que eso funcionara. En mi implementación, Apache no se ejecutaba como pid 1, tan la respuesta de kolypto no funcionó como está. El enfoque de Pieter parecía convincente, así que fusioné los dos y el resultado funciona de maravilla:
Técnicamente, esto mantiene el apache access.log y error.log ir a stdout y stderr en lo que respecta al recopilador de registros de docker, pero sería genial si hubiera una manera de separar los dos fuera el contenedor, como un interruptor para docker logs eso mostraría solo uno u otro...