Невозможно увидеть вывод STDERR через докер

Я запускаю образ php docker (php: 5.6-apache), в котором есть ошибки apache и журналы доступа, перенаправленные на STDERR и STDOUT соответственно с использованием символических ссылок.

Когда я запускаю образ докера на переднем плане или получаю доступ к журналам контейнера докера, я вижу вывод STDOUT. Но я не вижу никаких ошибок (даже когда я генерирую ошибки php).

Любая идея, почему это и как я могу это исправить?

Я использую Docker для Mac (но я не думаю, что это имеет какое-либо значение)

Спасибо

access.log -> /dev/stdout
error.log -> /dev/stderr
other_vhosts_access.log -> /dev/stdout

Редактировать / Решено:
Как упоминает и доказывает @BMitch ниже, перенаправление STDERR работает отлично.
Проблема была с настройкой PHP. Если я зарегистрировал ошибку с error_log(), он получит вывод в журнал. Но если бы у меня была ошибка php, например, при вызове неопределенной функции, ошибка никогда бы не появилась в журнале. Это кажется немного противоречивым. В любом случае, …

Я должен был создать php.ini файл в /usr/local/etc/php/ и добавьте эти два параметра:

log_errors = On
error_log = /var/log/apache2/error.log

и затем перезапустите контейнер докера. Это привело к тому, что все ошибки PHP регистрировались и выводились в STDERR. Смотрите ответ @ German для примера.

0

Решение

Я не могу воспроизвести вашу ситуацию. Если приведенное ниже не помогает, предоставьте mcve вашей ошибки.

Основной Dockerfile:

$ cat Dockerfile
FROM php:5.6-apache
COPY . /var/www/html/

Единственный php — этот файл для генерации ошибки:

$ cat error.php
<?
error_log("Hello error log.")
?>

Постройте и запустите его:

$ docker build -t test-php .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM php:5.6-apache
---> f16436448ebd
Step 2/2 : COPY . /var/www/html/
---> Using cache
---> cfe66485e2cc
Successfully built cfe66485e2cc
Successfully tagged test-php:latest

$ docker run -p 8080:80 -d --name test-php test-php
7f9a1836a8157963966b583579dff94c6413292547b84d22957add77ad2d8e14

Curl пуст, как и ожидалось, но при его вызове в журналах возникает ошибка:

$ curl localhost:8080/error.php

Показывать логи стандартного вывода, перенаправляя ошибку в / dev / null:

$ docker logs test-php 2>/dev/null
172.17.0.1 - - [31/May/2017:00:06:37 +0000] "GET /error.php HTTP/1.1" 200 174 "-" "curl/7.38.0"

Показывать логи stderr, перенаправляя stdout в / dev / null

$ docker logs test-php >/dev/null
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Wed May 31 00:06:25.064546 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.30 configured -- resuming normal operations
[Wed May 31 00:06:25.064584 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
[Wed May 31 00:06:37.833470 2017] [:error] [pid 17] [client 172.17.0.1:50040] Hello error log.

Обратите внимание на последнюю строку вывода ошибки.

4

Другие решения

Если вы хотите увидеть ошибки php в журнале apache2, вы должны активировать их. Для этого вы должны написать в php.ini файл в папку /usr/local/etc/php,

Я написал пример в репозитории, чтобы его можно было увидеть.

https://github.com/nitzap/stackoverflow-docker-php-error-log

Если вы хотите просмотреть журналы stdout и stderr, вы можете сделать это с помощью следующей команды вне ваших контейнеров:

docker logs <name_container>

Теперь, если вы хотите остаться подключенным к журналу, вы можете добавить опцию -f, как в команде tail.

docker logs <name_container> -f
3

В моем случае я пропустил этот магический параметр (по умолчанию «нет»):

#/etc/php/7.0/fpm/pool.d/www.conf
catch_workers_output = yes

Нашел здесь Symfony регистрируется на stdout внутри контейнера Docker

1
По вопросам рекламы [email protected]