踊る犬.netブログ (旧)

Dockerで子プロセスからのstdoutをsupervisordにリダイレクトする方法

Dockerではsupervisordを使ってプロセス管理をする事が多いですね。
そのようなコンテナでは、以下のコマンドでsupervisordが吐いたログを確認できます:

docker logs -f <container_id>

さらに、子プロセスが吐いたstdout/stderrを同様に確認したくなることがあります。
例えばmysqlapache2のログなどです。
いちいちコンテナにログインしてtail -fなんてやってられませんよね。
supervisord.confを以下のように設定すれば、これら子プロセスのログをsupervisordに転送できます:

[supervisord]
nodaemon=true

[program:mysql]
command=/usr/bin/pidproxy /var/run/mysqld/mysqld.pid /usr/sbin/mysqld
autorestart=true
stderr_logfile=/var/log/mysql/error.log
stderr_logfile_maxbytes=0

[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
autorestart=true
stdout_logfile=/var/log/apache2/access.log
stdout_logfile_maxbytes=0
stderr_logfile=/var/log/apache2/error.log
stderr_logfile_maxbytes=0

このように、stdout_logfilestderr_logfileにログファイルへのパスを指定することでリダイレクトさせています。
例えばプロセスのstdoutをリダイレクトさせたい時は以下のように記述します:

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

stdout_logfile_maxbytes=0 はログファイルのローテーションを無効にしています。もし指定しなければ以下のようなエラーが出ます:

[Errno 29] Illegal seek

参考になれば幸いです。

参考リンク