- Contents -
dockerの、php用のapacheイメージ(php-apache)ですが、
docker logs
コマンドでアクセスログ、エラーログを確認する事が出来るはずなんですが、
エラーログが確認できていない事に気づいて困ったので解決方法を記載します。
ログの確認
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の仕組みに少しずつ詳しくなれて嬉しい。