🔰

Dockerfileの「ENV PYTHONUNBUFFERED 1」について【初心者向けの記事】

2025/01/11に公開

調べごとが気になりだして
調べ始めて開発が進みません!
ワニかず@40歳 出戻りエンジニアです。
ワニかず@40歳 出戻りエンジニアです。
ワニかず@40歳 出戻りエンジニアです。。。

ヒロシ風にしてみました。
彼のキャンプ動画に一時期ハマりました。
私、インドアなのにね

さて、ある程度、技術が身につくと、
「何がわからなかったかわからない無双状態」
に突入することが、割とあるあるだと思うのですが、

Web系の開発の
「全てがわからない逆無双状態」
の現在の私の状態は、
Web系開発を志す人にとって
何かの指標になるのでは?
と考えて、わからないことは
ひたすらこうしてアウトプットしているのですが、

そうすると開発が進まないよね(笑)

当然なことで、
さっさと手を動かせ!!

という声が聞こえてきそうなのですが、
「全てがわからない逆無双状態」
は今しかない状態と思い、
転職先に入るまで時間のある今、
ひたすらアウトプットしておこうと思います。

ということで今回は、

dockerfile
ENV PYTHONUNBUFFERED 1

についてまとめました。

「ENV PYTHONUNBUFFERED 1」を
dockerfileに記載すると、

  1. リアルタイムでログを見られるようになり、デバッグが容易になる
  2. Pythonの出力バッファリングを無効にする

一つ目はなんとなく理解できるのですが、
二つ目が全く理解できないので調べてみました。

まず、バッファリングとは?

プログラムの出力(print文やログなど)を一時的にメモリに保管し、
一定量たまってから、まとめて実際の出力(ファイルやコンソール)に書き出す仕組み。

バッファリングがある場合の問題点

ログが遅延して表示される

  • エラーが起きた時、直前のログが表示されていない可能性がある。
  • 何が起きているのかリアルタイムで把握できない。

異常終了時にログが失われる

  • バッファに残ったままのログは出力されずに消えてしまう
  • 重要なデバッグ情報を見逃す可能性がある

ENV PYTHONUNBUFFERED 1を設定すると?

  • 出力が発生したらすぐに書き出される
  • Docker上でPythonアプリケーションを実行する際、ログがリアルタイムでコンソールに表示される
  • docker logsコマンドでも、最新のログをすぐに確認できる

例えば

print("処理開始")  # すぐに表示される
time.sleep(5)     # 5秒待機
print("処理終了")  # 5秒後すぐに表示される

バッファリングありの場合は、
両方のprint文が5秒後にまとめて表示される可能性があります。

逆にENV PYTHONUNBUFFERED 1を設定しないほうがいい場合

  1. 大量のログ出力がある場合
  • バッファリングがないと、全ての出力を即座に書き込む
  • I/O処理が増えてパフォーマンスが低下する可能性
  • 特に高頻度でログを出力するバッチ処理などで影響大
  1. ログの即時性よりもパフォーマンスを重視する場合
  • 例:データ処理バッチやETL処理
  • デバッグやモニタリングの必要性が低い
  • 処理速度が重要な場合
  1. メモリ使用量を最適化したい場合
  • バッファリングによってI/O操作を最適化
  • システムリソースの効率的な使用が可能
  • 特に大規模なデータ処理で有効

まとめ

ということで今回は
dockerfileの
「ENV PYTHONUNBUFFERED 1」
についてまとめてみました。

私の記憶も、誰かバッファリングしてください(意味不明)

最後までご覧いただきありがとうございました!

Discussion