web-dev-qa-db-ja.com

docker-compose Python appで標準出力を印刷しない

Docker Composeによって管理されるDockerコンテナー内で実行されるPythonアプリでprint()ステートメントを使用すると、sys.stderr出力のみがログに記録されます。Vanillaprint()ステートメント見られないので、これ:

print("Hello? Anyone there?")

...通常のログには表示されません:

enter image description here

(私のアプリの他のライブラリによって明示的に出力された他のログを見ることができますが、私自身の呼び出しはありません。)

print()呼び出しが無視されないようにするにはどうすればよいですか?

16
Lee Benson

デフォルトでは、Pythonはsys.stdoutへの出力をバッファリングします。

いくつかのオプションがあります。

1。明示的なflushを呼び出します

次のように、flush=Trueキーワードを含めるように元のprintステートメントをリファクタリングします。

print("Hello? Anyone there?", flush=True)

注:これにより、同じ印刷呼び出しだけでなく、entireバッファーがフラッシュされます。したがって、明示的にバッファリングされていない「裸の」印刷関数呼び出しが他の場所(つまりflush=Trueなし)にある場合、これらも常にフラッシュされます。

あなたは同じことを達成できます:

import sys
sys.stdout.flush()

このオプションは、フラッシュが発生するwhenを最大限に制御する場合に役立ちます。

2。PYTHONUNBUFFERED env varを使用してアプリ全体をバッファリング解除します

以下をdocker-compose.ymlファイルのenvironmentセクションにドロップします。

PYTHONUNBUFFERED: 1

これにより、stdoutへのすべての出力がすぐにフラッシュされます。

。実行python with -u

上記のオプション#2と同様に、これにより、アプリの実行期間全体でPythonが 'unbuffered'で実行されます。python -u <entrypoint.py>で実行するだけです-環境変数は不要です。

21
Lee Benson

Dockerfileの実行行にオプション-uを追加すると、ログが出力されます。

CMD ['python', '-u', 'my_python_script.py']
10