Как войти в файл из докеризованного php-приложения

#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