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?

À M
la source

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
Spyros Lambrinidis
la source
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
Darren Gordon
la source
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
Et moi
la source
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