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?
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
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
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