Come ottenere php-fpm per accedere a stdout / stderr quando si esegue in un contenitore docker


18

Ho php-fpm in un contenitore finestra mobile e in DockerfileModifica il file di configurazione di fpm ( /etc/php5/fpm/pool.d/www.conf) per impostare i log di accesso su cui andare /var/log/fpm-access.loge i log degli errori su /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

Funziona bene - Posso vedere una shell nel contenitore per vedere i registri. Ma ... non è una buona pratica.

Il problema è quando provo ad usare il raccoglitore log docker : ho bisogno di php-fpm per accedere a stdout o stderr in modo che docker possa catturarli e fornirli al docker logscomando.

Ho provato a farlo nel Dockerfile(che è un'idea che ho copiato dall'immagine docker nginx ufficiale ):

# 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

Non funziona - non si vede nessun registro di accesso docker logs- Sto cercando di capire perché? Qualcun altro che utilizza fpm nella finestra mobile è riuscito a far funzionare la registrazione nel raccoglitore di registro della finestra mobile?

Risposte:


24

Ok, il modo per farlo è inviare l'errore e i log di accesso al seguente indirizzo:

/proc/self/fd/2

In php5-fpm.logaggiunta:

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

E 'possibile che vi sia /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, e /dev/stdoute /dev/stderrvarianti. Potrebbe essere più facile da ricordare da usare /dev/stdin.
CMCDragonkai,

1
C'è un errore nella risposta - è "access_log" non "access.log"
rfay

2
Sembra che sia access.log: github.com/docker-library/php/blob/…
CommandZ

13

Nota che la configurazione di fpm al forno per l'ultima versione dell'immagine docker fpm ufficiale di PHP scrive nei flussi 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

Grazie, è interessante. Non sapevo che ora ci fosse un'immagine ufficiale
Tom,

1
A quale immagine docker ti riferisci? Ho eseguito php: 7-fpm e non sembra che stiano registrando errori stderr.
Derek,

1

I log di PHP-FPM appariranno solo in STDERR - quindi puoi collegare simbolicamente fpm.loga /dev/stderrse vuoi.

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

4
Questa soluzione è stata data nella domanda e il richiedente ha dichiarato che non funzionava. Forse puoi specificare come può caricarlo nel suo file docker per farlo funzionare correttamente o altre diagnosi che può eseguire sul suo contenitore?
Andrew Domaszek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.