docker-library / php

Docker Official Image packaging for PHP
https://php.net
MIT License
3.81k stars 2k forks source link

php:8.2-fpm (bullseye) docker (swarm) no log #1411

Open peterschristoph opened 1 year ago

peterschristoph commented 1 year ago

hi, after some time i am convinced that there is a bug in php:8.2-fpm image or in connection with docker swarm or in docker?

When using the php:8.2-fpm image, this repo writes a docker config which redirects the access and error log to the proc self fd 2. Unfortunately all logs that should end up in the docker logs are lost.

Environment

further information

# cat local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2

; https://github.com/docker-library/php/pull/725#issuecomment-443540114
log_limit = 8192

[www]
; php-fpm closes STDOUT on startup, so sending logs to /proc/self/fd/1 does not work.
; https://bugs.php.net/bug.php?id=73886
access.log = /proc/self/fd/2

clear_env = no

; Ensure worker stdout and stderr are sent to the main error log.
catch_workers_output = yes
decorate_workers_output = no

Inside docker container:

# ls -la /proc/self/fd/2
lrwx------ 1 root root 64 May 30 09:43 /proc/self/fd/2 -> /dev/pts/0
# ls -la /proc/self/fd/1
lrwx------ 1 root root 64 May 30 09:44 /proc/self/fd/1 -> /dev/pts/0
# ls -la /proc/1/fd/2
l-wx------ 1 root root 64 May 30 01:33 /proc/1/fd/2 -> 'pipe:[1118282]'
# ls -la /dev/stderr
lrwxrwxrwx 1 root root 15 May 30 01:33 /dev/stderr -> /proc/self/fd/2

I'm not the only one with this behavior, for example: https://github.com/docker-library/php/issues/878#issuecomment-1345275524

iotanum commented 1 year ago

Having the same issue. Haven't found a solution atm. Running 8.2-php-fpm in K8S, neither /proc/self/fd/2 nor /proc/1/fd/2 work for me.

Ziyann commented 10 months ago

I'm also having this issue, with the 8.2-fpm-alpine3.18 images. Dockerfile writes the error_log directive to /usr/local/etc/php-fpm.d/docker.conf. However, phpinfo reveals that that file isn't parsed.

LaurentGoderre commented 9 months ago

I think it's normal that only /proc/1/fd/2 works because it's the output of process number 1. Using self would refer to another process when running it from a shell.

LaurentGoderre commented 9 months ago

Maybe this part of the Dockerfile is relevant:

https://github.com/docker-library/php/blob/master/8.3/bookworm/fpm/Dockerfile#L271-L272

renepupil commented 6 months ago

For anyone who wants to log to kubernetes stdout:

As stupid as it may look putting the php-fpm command in a bash script from a docker file logs properly:

RUN touch /start.sh
RUN echo "#!/bin/bash" >> /start.sh
RUN echo "php-fpm" >> /start.sh
...
CMD ["/bin/bash", "/start.sh"]

EDIT: As suggested by @yosifkit not recommended

CMD ["/bin/bash", "-c", "tail -f /var/logs/some/error.log & php-fpm"]
# tail => Utility for displaying the last part of files.
#   -f => Keep the file open after reaching the end and continuously monitors the file, output new content to stdout.

Sry, but found this issue when searching for that problem...

yosifkit commented 6 months ago
CMD ["/bin/bash", "-c", "tail -f /var/logs/some/error.log & php-fpm"]

I would strongly suggest caution before using this. This leaves bash as a resident process and so any signal (like SIGINT/SIGHUP) would be sent to bash (and ignored, since it is PID 1) and not to the PHP process. So, stopping the container would not work without SIGKILL (or manually signaling the PHP process inside the container).

renepupil commented 5 months ago

@yosifkit Hey, thanks for your feedback, just a few questions regarding that...

So, docker stop or stopping the container via Docker desktop would not work, right? (We had to use kill)

Just tested this using the image with tail -f /var/logs/some/error.log as a kubernetes container image, and it seems at least kubernetes does not have problem replacing the pod when the resource gets updated.

Do you know any other problems that might occur using that workaround in kubernetes?

renepupil commented 5 months ago

I found another working solution:

RUN touch /start.sh
RUN echo "#!/bin/bash" >> /start.sh
RUN echo "php-fpm" >> /start.sh
...
CMD ["/bin/bash", "/start.sh"]

@yosifkit Do you see any issues with that?