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


18

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

J'ai essayé de le faire dans le Dockerfile(qui est une idée que j'ai copiée à partir de l' 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?

Réponses:


24

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

/proc/self/fd/2

En php5-fpm.logplus:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2

Il est possible qu'il y en ait /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, /dev/stdoutet des /dev/stderrvariantes. Pourrait être plus facile à retenir à utiliser /dev/stdin.
CMCDragonkai

1
Il y a une erreur dans la réponse - c'est "access_log" et non "access.log"
rfay

2
Il semble que ce soit access.log: github.com/docker-library/php/blob/…
CommandZ

13

Notez que la configuration baked in fpm pour la dernière version de l' image Docker PHP fpm officielle é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

Merci, c'est intéressant. Je ne savais pas qu'il y avait une image officielle maintenant
Tom

1
De quelle image docker parlez-vous? J'ai exécuté php: 7-fpm et il ne semble pas y avoir d'erreurs de journalisation stderr.
Derek

1

Les journaux PHP-FPM n'apparaîtront que dans STDERR - vous pouvez donc créer un lien symbolique fpm.logvers /dev/stderrsi vous le souhaitez.

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

4
Cette solution a été donnée dans la question et le demandeur a déclaré que cela ne fonctionnait pas. Peut-être pouvez-vous spécifier comment il peut le charger dans son dockerfile pour le faire fonctionner correctement ou d'autres diagnostics qu'il peut effectuer sur son conteneur?
Andrew Domaszek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.