Como obter o php-fpm para registrar no stdout / stderr ao executar em um contêiner de docker

18

Eu tenho o php-fpm em um contêiner do docker e no Dockerfileedito o arquivo de configuração do fpm ( /etc/php5/fpm/pool.d/www.conf) para configurar os logs de acesso para acessar /var/log/fpm-access.loge os logs de erro para /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

Isso funciona bem - posso colocar um shell no contêiner para ver os logs. Mas ... não é uma prática recomendada.

O problema é quando tento usar o coletor de logs do docker - preciso do php-fpm para efetuar logon no stdout ou stderr, para que o docker possa capturá-los e fornecê-los ao docker logscomando.

Tentei fazer isso na Dockerfile(que é uma ideia que copiei da imagem oficial do nginx docker ):

# 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

Isso não está funcionando - nenhum registro de acesso é visto docker logs- eu estou tentando descobrir por quê? Alguém mais que usa o fpm no docker conseguiu fazer o log funcionar no coletor de logs do docker?

Tom
fonte

Respostas:

24

Ok, a maneira de fazer isso é enviar o erro e os logs de acesso para o seguinte endereço:

/proc/self/fd/2

Em php5-fpm.logadição:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
Spyros Lambrinidis
fonte
É possível que haja /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, e /dev/stdoute /dev/stderrvariantes. Pode ser mais fácil lembrar de usar /dev/stdin.
CMCDragonkai
1
Há um erro na resposta - é "access_log" não "access.log"
rfay
2
Parece que é access.log: github.com/docker-library/php/blob/…
CommandZ
13

Observe que a configuração do inpm para a versão mais recente da imagem oficial do docker do PHP grava nos fluxos padrão:

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
fonte
Obrigado, isso é interessante. Eu não sabia que existe uma imagem oficial agora
Tom
1
A qual imagem do docker você está se referindo? Corri o php: 7-fpm e não parece estar registrando erros stderr.
Derek
1

Registros PHP-FPM só vai aparecer STDERR - assim você pode ligar simbolicamente o fpm.logque /dev/stderrse quiser.

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log
E eu
fonte
4
Esta solução foi dada na pergunta e o autor da pergunta afirmou que não funcionava. Talvez você possa especificar como ele pode carregá-lo no arquivo docker para fazê-lo funcionar corretamente ou outros diagnósticos que ele pode executar em seu contêiner?
Andrew Domaszek