Як отримати php-fpm для входу в stdout / stderr при запуску в контейнер докера


18

У мене є php-fpm у контейнері докера та в Dockerfileредагуючому файлі конфігурації fpm ( /etc/php5/fpm/pool.d/www.conf), щоб налаштувати журнали доступу для переходу /var/log/fpm-access.logта журнали помилок для переходу до /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

Це прекрасно працює - я можу отримати оболонку в контейнер, щоб побачити журнали. Але ... це не найкраща практика.

Проблема полягає в тому, що я намагаюся використовувати колектор журналів docker - мені потрібен php-fpm для входу в stdout або stderr, щоб докер міг захопити їх і надати їх docker logsкоманді.

Я спробував це зробити в Dockerfile((це ідея, яку я скопіював з офіційного зображення докера nginx ):

# 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

Це не працює - з журналів доступу не видно docker logs- я намагаюся зрозуміти, чому? Хто-небудь ще, хто використовує fpm у docker, встиг заставити журнал працювати до колектора журналів docker?

Відповіді:


24

Гаразд, спосіб зробити це - надіслати помилки та журнали доступу на таку адресу:

/proc/self/fd/2

У php5-fpm.logоних:

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

Можливо там бути /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, і /dev/stdoutта /dev/stderrваріанти. Можливо, простіше запам’ятати у використанні /dev/stdin.
CMCDragonkai

1
У відповіді є помилка - це "access_log" не "access.log"
rfay

2
Здається, що це access.log: github.com/docker-library/php/blob/…
CommandZ

13

Зауважте, що конфігурація, запечена у fpm, для останньої версії офіційного зображення докера PHP fpm записується до стандартних потоків:

error_log = /proc/self/fd/2

...

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

Дякую, це цікаво. Я не знав, що зараз є офіційне зображення
Тома,

1
На який образ докера ви посилаєтесь? Я запустив php: 7-fpm, і, схоже, помилки в журналі не було stderr.
Дерек

1

Журнали PHP-FPM буде з'являтися тільки в STDERR - так що ви можете символічні посилання fpm.logна , /dev/stderrякщо ви хочете.

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

4
Це рішення було дано у запитанні, і запитуючий заявив, що він не працює. Може бути, ви можете вказати, як він може завантажити його у свій докерфайл, щоб він працював належним чином або інша діагностика, яку він може виконувати на своєму контейнері?
Андрій Домашек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.