Cómo hacer que php-fpm inicie sesión en stdout / stderr cuando se ejecuta en un contenedor acoplable

18

Tengo php-fpm en un contenedor docker y en el Dockerfileedito el archivo de configuración fpm ( /etc/php5/fpm/pool.d/www.conf) para configurar los registros de acceso /var/log/fpm-access.logy los registros de errores para ir a /var/log/fpm-php.www.log:

# Do some php-fpm config
#  Redirect worker stdout and stderr into main error log
#  Activate the fpm access log
#  Enable display errors
#  Enable the error log
RUN sed -i '/^;catch_workers_output/ccatch_workers_output = yes' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;access.log/caccess.log = /var/log/fpm-access.log' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_flag\[display_errors\]/cphp_flag[display_errors] = off' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_admin_value\[error_log\]/cphp_admin_value[error_log] = /var/log/fpm-php.www.log' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_admin_flag\[log_errors\]/cphp_admin_flag[log_errors] = on' /etc/php5/fpm/pool.d/www.conf

Esto funciona bien: puedo colocar un caparazón en el contenedor para ver los registros. Pero ... no es la mejor práctica.

El problema es cuando intento usar el recopilador de registros de Docker : necesito php-fpm para iniciar sesión en stdout o stderr para que Docker pueda capturarlos y proporcionarlos al docker logscomando.

Intenté hacer esto en Dockerfile(que es una idea que copié de la imagen oficial de nginx docker ):

# Redirect fpm logs to stdout and stderr so they are forwarded to the docker log collector
RUN ln -sf /dev/stdout /var/log/fpm-access.log && \
    ln -sf /dev/stderr /var/log/fpm-php.www.log

Esto no funciona. No se ven registros de acceso. Intento docker logsaveriguar por qué. ¿Alguien más que usa fpm en Docker logró que el registro funcione en el Docker Log Collector?

Tom
fuente

Respuestas:

24

Ok, la forma de hacerlo es enviar el error y los registros de acceso a la siguiente dirección:

/proc/self/fd/2

En php5-fpm.logagregar:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
Spyros Lambrinidis
fuente
Es posible que haya /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, /dev/stdouty /dev/stderrvariantes. Puede ser más fácil de recordar usar /dev/stdin.
CMCDragonkai
1
Hay un error en la respuesta: es "access_log", no "access.log"
rfay el
2
Parece que es access.log: github.com/docker-library/php/blob/…
CommandZ
13

Tenga en cuenta que la configuración fpm horneada para la última versión de la imagen del acoplador PHP fpm oficial escribe en las transmisiones estándar:

error_log = /proc/self/fd/2

...

; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
Darren Gordon
fuente
Gracias, eso es interesante. No sabía que hay una imagen oficial ahora
Tom
1
¿A qué imagen de docker te refieres? Ejecuté php: 7-fpm y no parece estar registrando errores stderr.
Derek
1

Los registros de PHP-FPM solo aparecerán en STDERR, por lo que puede vincularlos fpm.loga /dev/stderrsi lo desea.

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log
Y yo
fuente
44
Esta solución se dio en la pregunta y el autor de la pregunta declaró que no funcionaba. ¿Quizás pueda especificar cómo puede cargarlo en su dockerfile para que funcione correctamente u otros diagnósticos que puede realizar en su contenedor?
Andrew Domaszek