docker php でエラーログが出力されない

dockerの、php用のapacheイメージ(php-apache)ですが、
docker logsコマンドでアクセスログ、エラーログを確認する事が出来るはずなんですが、
エラーログが確認できていない事に気づいて困ったので解決方法を記載します。

DockerHub - PHP

ログの確認

dockerでも、docker-composeコマンドでも下記のとおりログ出力を確認することができます。

# ログを見る
docker logs -f <ContainerName>
# or
docker-compose logs -f <ContainerName>

だいたい、どのコンテナもこんな感じでログを確認できるんですが、
php-apacheのコンテナではアクセスログだけが出力されていて、エラーログが確認できないようです。

php.ini を修正する必要がある。

で、Issueにもあがっていたので、
コンテナ側のphp.iniファイルでエラー出力するように設定が必要みたいです。

https://github.com/docker-library/php/issues/212

Dockerfile で設定する

Dockerfileでの設定の仕方をここでは記載しておきます。

FROM php:5.6-apache

RUN echo '\
log_errors = On\n\
error_log = /dev/stderr\n\
error_reporting = E_ALL\n\
' >> /usr/local/etc/php/php.ini

FROMで、dockerイメージを指定し、RUNで、php.iniに設定を追記しています。
エラーログ出力を有効にし、ログレベルを設定している。

このDockerfileを元にbuildして、コンテナ起動すればエラーログも出力されるのが確認できるでしょう。

[補足] コンテナ内のphp.iniの場所を確認する

まずは、コンテナにbashでログインする

docker exec -it <ContainerName> bash

php -i コマンドから、php.iniの場所を確認する

php -i | grep php.ini
# ==> Configuration File (php.ini) Path => /usr/local/etc/php

/usr/local/etc/php にphp.iniを配置すれば良い事がわかる。
※デフォルトでは、この場所にphp.iniファイルは最初から配置されていないようです。

[補足] ちなみにコンテナのログ出力ってどうなってんの?

php-apache の場合、
dockerコンテナ内のアクセスログ、エラーログ出力はどうなっているかというと、
このように出力先のファイルがそれぞれ、stdout、stderr へのシンボリックリンクになっています。

# ls -la /var/log/apache2/
lrwxrwxrwx 1 root     root       11 Jun 21  2017 access.log -> /dev/stdout
lrwxrwxrwx 1 root     root       11 Jun 21  2017 error.log -> /dev/stderr

で、コンテナの標準出力、エラー出力は、
出力ファイルとして、docker内にファイルとして出力されているので、
docker logs で、それらをtailしているだけみたいです。

[補足] DockerfileのHeredocについて

Dockerfileでは、ヒアドキュメントの記載ができないようです。

なので、以下のように一行ずつRUN echoを書くか、

RUN echo 'log_errors = On'         >> /usr/local/etc/php/php.ini
RUN echo 'error_log = /dev/stderr' >> /usr/local/etc/php/php.ini
RUN echo 'error_reporting = E_ALL' >> /usr/local/etc/php/php.ini

echo を単純にエスケープコードを挟んで、記述するしかないようです。

RUN echo '\
log_errors = On\n\
error_log = /dev/stderr\n\
error_reporting = E_ALL\n\
' >> /usr/local/etc/php/php.ini

参考URL:
https://github.com/moby/moby/issues/1554

おしまい

Dockerの仕組みに少しずつ詳しくなれて嬉しい。

コメントを残す