結論
-u
オプションで解決した
docker-compose.yml
command: python -u main.py
経緯
以下のようなファイルをdocker-compose.ymlのcommand
に指定したらログに何も出力されなかった。1
import time
print('hoge')
while True:
print('fuga')
time.sleep(1)
原因調査のために部分的に切り分けていきます。
-
docker-compose run
だと動作する -
docker-compose run python bash
で入ったbash内で立ち上げたpythonインタプリタ内でも動作する
最終的にpythonスクリプトを何行かづつコメントアウトしたりして、ついにwhile True:
以下が問題らしい事がわかりました。2
標準出力とバッファリング
Pythonのprint()
などによる標準出力はすぐには出力されずバッファリングされ、タイミングを見て出力されます。
つまり、while True:
によって実行がいつまで経っても終了せず、またバッファが一杯になることもないため、出力を受け取るdocker-composeに結果が渡されなかったということでした。
python
にはバッファリングを無効化するためのオプション-u
があり、これを指定することで解決できました。
参考:
Python 3 で標準出力のブロックバッファリングを止める方法 - Qiita
head コマンドの不思議な挙動と標準入出力のバッファリング - CUBE SUGAR CONTAINER