it-swarm.com.de

Wie man php-fpm dazu bringt, sich bei stdout / stderr anzumelden, wenn es in einem Docker-Container ausgeführt wird

Ich habe php-fpm in einem Docker-Container und in Dockerfile bearbeite ich die fpm-Konfigurationsdatei (/etc/php5/fpm/pool.d/www.conf), Um Zugriffsprotokolle für /var/log/fpm-access.log Und Fehlerprotokolle für einzurichten gehe zu /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

Dies funktioniert gut - ich kann eine Shell in den Container bekommen, um die Protokolle zu sehen. Aber ... es ist keine bewährte Methode.

Das Problem ist, wenn ich versuche, den Docker-Protokollkollektor zu verwenden - Ich benötige php-fpm, um mich bei stdout oder stderr anzumelden, damit Docker sie erfassen und bereitstellen kann zum Befehl docker logs.

Ich habe versucht, dies im Dockerfile zu tun (eine Idee, die ich aus dem offiziellen Nginx-Docker-Image kopiert habe ):

# 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

Dies funktioniert nicht - es werden keine Zugriffsprotokolle von docker logs Gesehen - Ich versuche herauszufinden, warum? Hat es jemand anderes, der fpm in Docker verwendet, geschafft, die Protokollierung im Docker-Protokollkollektor zum Laufen zu bringen?

19
Tom

Ok, der Weg, dies zu tun, besteht darin, den Fehler und die Zugriffsprotokolle an die folgende Adresse zu senden:

/proc/self/fd/2

Im php5-fpm.log hinzufügen:

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

Beachten Sie, dass das eingebrannte fpm config für die neueste Version des offiziellen PHP fpm docker image in die Standard-Streams schreibt:

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

PHP-FPM-Protokolle werden nur in STDERR angezeigt. Sie können also fpm.log Mit /dev/stderr Verknüpfen, wenn Sie möchten.

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