web-dev-qa-db-fra.com

Comment obtenir php-fpm pour se connecter à stdout / stderr lors de l'exécution dans un conteneur Docker

J'ai php-fpm dans un conteneur docker et dans le Dockerfile je modifie le fichier de configuration fpm (/etc/php5/fpm/pool.d/www.conf) pour configurer les journaux d'accès pour aller à /var/log/fpm-access.log et journaux d'erreurs pour aller à /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

Cela fonctionne très bien - je peux obtenir un Shell dans le conteneur pour voir les journaux. Mais ... ce n'est pas la meilleure pratique.

Le problème est lorsque j'essaie d'utiliser le collecteur de journaux docker - J'ai besoin de php-fpm pour me connecter à stdout ou stderr afin que docker puisse les capturer et les fournir à la docker logs commande.

J'ai essayé de le faire dans le Dockerfile (qui est une idée que j'ai copiée à partir du image docker nginx officielle ):

# 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

Cela ne fonctionne pas - aucun journal d'accès n'est visible depuis docker logs - J'essaie de comprendre pourquoi? Quelqu'un d'autre qui utilise fpm dans Docker a-t-il réussi à faire fonctionner la journalisation dans le collecteur de journaux Docker?

19
Tom

Ok, la façon de procéder consiste à envoyer l'erreur et les journaux d'accès à l'adresse suivante:

/proc/self/fd/2

Dans php5-fpm.log ajouter:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
25
Spyros Lambrinidis

Notez que le baked in fpm config pour la dernière version de l'officiel PHP fpm docker image écrit dans les flux standard:

error_log = /proc/self/fd/2

...

; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
15
Darren Gordon

Les journaux PHP-FPM n'apparaîtront que dans STDERR - vous pouvez donc créer un lien symbolique entre fpm.log à /dev/stderr si tu veux.

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log
1
Andi