こんにちは。 今回は、アプリケーションの標準出力等を Docker コンテナのログに出力する方法をご紹介します。
標準出力や標準エラー出力をコンテナにリダイレクトさせる
Docker コンテナの中に main.py
というファイルがあったとします。
ここでファイルを実行し、発生する標準出力を /proc/1/fd/1
にリダイレクトさせます。
python main.py > /proc/1/fd/1
もし標準エラー出力も Docker コンテナのログに出力させたい場合は、以下のようにします。
python main.py > /proc/1/fd/1 2> /proc/1/fd/2
/proc/1/fd/1
の fd
は "file descriptors" を意味します。これはプロセスが開いているファイルを表すディレクトリです。
そして、 fd
の後の 1
や 2
といった番号は「ファイルディスクリプタ番号」と呼ばれるもので、プロセスに関連づけられた入出力に付けられた番号です。
/proc/[pid]/fd/
ディレクトリには、そのプロセスが開いている全てのファイルディスクリプタがリストされています。
通常、Unix系のシステムでは以下のようになります:
0: 標準入力
1: 標準出力
2: 標準エラー
したがって、 /proc/1/fd/1
は PID 1 のプロセスの標準出力を、/proc/1/fd/2
は標準エラーを表します。
もし標準エラー出力を標準出力と同じファイルにリダイレクトさせたい場合は、以下のようにします。
python main.py > /proc/1/fd/1 2>&1
or
python main.py &> /proc/1/fd/1
or
python main.py >& /proc/1/fd/1
(補足) Docker コンテナのログの仕組み
/proc/1/fd/1
は、コンテナ内の PID 1 のプロセス(通常はコンテナのメインプロセス)の標準出力を表します。
Docker は、コンテナ内のメインプロセスの標準出力と標準エラー出力をキャプチャし、それをコンテナのログとして出力しているようです。
よって、今回のように /proc/1/fd/1
にリダイレクトされた標準出力や標準エラー出力は、 PID 1 のプロセスの標準出力としてキャプチャされ、コンテナのログに出力されるという仕組みです。
ただし、この方法は Docker の特有の設定に基づいており、通常の Linux 環境や他のタイプのコンテナ技術では、/proc/1/fd/1
が同じ方法で機能するとは限りません。
例えば、一般的な Linux システムでは、/proc/1/fd/1
はシステムの init プロセスに関連付けられており、このファイルディスクリプタを介して出力をリダイレクトすることは一般的ではありません。
そのため、この手法をDocker以外で適用する場合は、環境の特性を十分に理解し、適切な方法を選択する必要があります。
まとめ
今回は、Docker コンテナのログへアプリケーションの標準出力等を出力する方法を紹介し、
- Docker コンテナは PID 1 のプロセスの標準エラー出力や標準エラー出力をキャプチャし、出力している
- アプリケーションの標準出力や標準エラー出力も PID 1 にリダイレクトさせることで、コンテナのログに出力させる
ということが分かりました。
この記事が役に立てば幸いです。