#php #docker #error-logging
Вопрос:
У меня есть докеризованное php-приложение. Моя проблема заключается в том, как записывать ошибки из службы php в выделенный файл на хосте. файл docker выглядит следующим:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "3000:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./public:/public
php:
build:
context: .
dockerfile: PHP.Dockerfile
environment:
APP_MODE: 'development'
env_file:
- 'dev.env'
volumes:
- ./app:/app
- ./public:/public
- ./php.conf:/usr/local/etc/php-fpm.d/zz-log.conf
mysql:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: <pass here>
env_file:
- 'dev.env'
volumes:
- mysqldata:/var/lib/mysql
- ./app:/app
ports:
- '3306:3306'
volumes:
mysqldata: {}
мой php.conf
, который отображается как /usr/local/etc/php-fpm.d/zz-log.conf
внутри службы php, выглядит следующим образом:
php_admin_value[error_log] = /app/php-error.log
php_admin_flag[log_errors] = on
catch_workers_output = yes
Мое намерение состоит в том, чтобы использовать error_log()
функцию php и записать все журналы, в php-error.log
которых находится файл внутри тома app
.
Теперь все журналы из контейнеров отображаются только на терминале.
Я боролся с этим несколько часов и понятия не имею, как продолжать. Спасибо
Комментарии:
1. Можете ли вы дать нам дополнительную информацию, например, о том, что работает или не работает? Вы вообще можете войти в файл?
Ответ №1:
Я не знаю, каков ваш исходный образ. Я предполагаю, что какой-то официальный образ докера для PHP, например https://hub.docker.com/_/php
Все контейнерные приложения обычно настроены для входа в stdout
систему, поэтому вы должны переопределить это поведение. Это действительно специфично для PHP, и я не эксперт по PHP. Из того, что вы нам сообщили, похоже, что вы знаете, как переопределить это поведение (с помощью некоторой error_log()
функции и php_admin_value[error_log] = /app/php-error.log
свойства.
Если поведение переопределено, вы должны убедиться, что файл app/php-error.log
существует внутри контейнера PHP (т. Е. Проникнуть внутрь контейнера с помощью чего-то подобного docker exec -it my-container-id /bin/bash
, а затем сделать ls /app/php-error.log
и cat /app/php-error.log
посмотреть, создан ли файл.
Поскольку вы монтируете ./app
каталог с хоста в /app
каталог в контейнере, у вас уже есть их зеркальное отображение. Все, что находится внутри контейнера /app
, вы найдете также в своем /path/to/docker/compose/app
каталоге. Вы можете проверить, существует ли файл и есть ли внутри какое-либо содержимое. Если нет, вам не удалось переопределить поведение по умолчанию для входа в систему PHP.
Комментарии:
1. После некоторого time…is готово. Контейнер
php' directs errors to stderr
[глобальный] error_log = /proc/self/fd/2` итак, я переопределил директиву, поместив в каталог «php-fpm.conf.d» файл с именем «zz-my.conf»[global] error_log = /app/php-error.log