Dockerfileの「ENV PYTHONUNBUFFERED 1」について【初心者向けの記事】
調べごとが気になりだして
調べ始めて開発が進みません!
ワニかず@40歳 出戻りエンジニアです。
ワニかず@40歳 出戻りエンジニアです。
ワニかず@40歳 出戻りエンジニアです。。。
ヒロシ風にしてみました。
彼のキャンプ動画に一時期ハマりました。
私、インドアなのにね
さて、ある程度、技術が身につくと、
「何がわからなかったかわからない無双状態」
に突入することが、割とあるあるだと思うのですが、
Web系の開発の
「全てがわからない逆無双状態」
の現在の私の状態は、
Web系開発を志す人にとって
何かの指標になるのでは?
と考えて、わからないことは
ひたすらこうしてアウトプットしているのですが、
そうすると開発が進まないよね(笑)
当然なことで、
さっさと手を動かせ!!
という声が聞こえてきそうなのですが、
「全てがわからない逆無双状態」
は今しかない状態と思い、
転職先に入るまで時間のある今、
ひたすらアウトプットしておこうと思います。
ということで今回は、
ENV PYTHONUNBUFFERED 1
についてまとめました。
「ENV PYTHONUNBUFFERED 1」を
dockerfileに記載すると、
- リアルタイムでログを見られるようになり、デバッグが容易になる
- Pythonの出力バッファリングを無効にする
一つ目はなんとなく理解できるのですが、
二つ目が全く理解できないので調べてみました。
まず、バッファリングとは?
プログラムの出力(print文やログなど)を一時的にメモリに保管し、
一定量たまってから、まとめて実際の出力(ファイルやコンソール)に書き出す仕組み。
バッファリングがある場合の問題点
ログが遅延して表示される
- エラーが起きた時、直前のログが表示されていない可能性がある。
- 何が起きているのかリアルタイムで把握できない。
異常終了時にログが失われる
- バッファに残ったままのログは出力されずに消えてしまう
- 重要なデバッグ情報を見逃す可能性がある
ENV PYTHONUNBUFFERED 1を設定すると?
- 出力が発生したらすぐに書き出される
- Docker上でPythonアプリケーションを実行する際、ログがリアルタイムでコンソールに表示される
- docker logsコマンドでも、最新のログをすぐに確認できる
例えば
print("処理開始") # すぐに表示される
time.sleep(5) # 5秒待機
print("処理終了") # 5秒後すぐに表示される
バッファリングありの場合は、
両方のprint文が5秒後にまとめて表示される可能性があります。
逆にENV PYTHONUNBUFFERED 1を設定しないほうがいい場合
- 大量のログ出力がある場合
- バッファリングがないと、全ての出力を即座に書き込む
- I/O処理が増えてパフォーマンスが低下する可能性
- 特に高頻度でログを出力するバッチ処理などで影響大
- ログの即時性よりもパフォーマンスを重視する場合
- 例:データ処理バッチやETL処理
- デバッグやモニタリングの必要性が低い
- 処理速度が重要な場合
- メモリ使用量を最適化したい場合
- バッファリングによってI/O操作を最適化
- システムリソースの効率的な使用が可能
- 特に大規模なデータ処理で有効
まとめ
ということで今回は
dockerfileの
「ENV PYTHONUNBUFFERED 1」
についてまとめてみました。
私の記憶も、誰かバッファリングしてください(意味不明)
最後までご覧いただきありがとうございました!
Discussion