7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-compose upでPythonのログが出力されない

Last updated at Posted at 2019-11-27

結論

-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

  1. 「動作しない」ではなく「出力されない」だと気付くのにもだいぶ時間かかった

  2. import文を削除したら出力されることがあったが、これはエラーによってその行で動作が停止しただけだった

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?