So bringen Sie PHP-fpm dazu, sich bei der Ausführung in einem Docker-Container bei stdout / stderr anzumelden

Ich habe PHP-fpm in einem Docker-Container und in der Dockerfile Ich bearbeite die FPM-Konfigurationsdatei (/etc/php5/fpm/pool.d/www.conf), um Zugriffsprotokolle einzurichten, um zu gehen /var/log/fpm-access.log und Fehlerprotokolle, um zu gehen /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 logRUN 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

Das funktioniert gut - ich kann eine Shell in den Container bringen, um die Protokolle anzuzeigen. Aber... es ist keine Best Practice.

Das Problem ist, wenn ich versuche, das zu verwenden docker-Protokollkollektor - Ich benötige php-fpm, um mich bei stdout oder stderr anzumelden, damit Docker sie erfassen und dem zur Verfügung stellen kann docker logs Befehl.

Ich habe versucht, dies in der zu tun Dockerfile (was eine Idee ist, die ich von der kopiert habe offizielles Nginx-Docker-Image):

# Redirect fpm logs to stdout and stderr so they are forwarded to the docker log collectorRUN 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 angezeigt docker logs - Ich versuche herauszufinden, warum? Hat es jemand anderes, der fpm in Docker verwendet, geschafft, die Protokollierung für den Docker-Protokollkollektor zum Laufen zu bringen?

Ok, Sie können dies tun, indem Sie den Fehler und die Zugriffsprotokolle an die folgende Adresse senden:

/proc/self/fd/2

In php5-fpm.log hinzufügen:

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

BEACHTEN: access.log ist richtig, finden Sie auf dieser Seite https://www.php.net/manual/en/install.fpm.configuration.php

Beachten Sie, dass die gebackenen in fpm-Konfiguration für die neueste Version des offiziellen PHP fpm Docker-Bild schreibt in die Standard-Streams:

error_log = /proc/self/fd/2...; if we send this to /proc/self/fd/1, it never appearsaccess.log = /proc/self/fd/2

PHP-FPM-Protokolle werden nur in STDERR angezeigt - Sie können also die fpm.log zu /dev/stderr wenn du willst.

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