Python Tips: Docker で Python を使うときに有用な環境変数まとめ

Docker で Python 3 を動かす人が知っておくとよさそうな環境変数についてかんたんにまとめました。

Docker で Python 3 を使うときに有用な環境変数

Python 本体

変数名 意味
PYTHONDONTWRITEBYTECODE 非空なら .pyc を生成しない 1
PYTHONUNBUFFERED 非空なら標準出力・標準エラーのストリームのバッファリングを行わない 1
PYTHONUTF8 1 ならインタプリタの UTF-8 モードを有効にする 1
PYTHONIOENCODING 標準入出力のエンコーディングを設定する "UTF-8"
PYTHONBREAKPOINT breakpoint() で呼ばれる callable を設定する "IPython.terminal.debugger.set_trace"

pip コマンド

変数名 意味
PIP_DISABLE_PIP_VERSION_CHECK pip 自体の定期的なバージョンチェックを無効化する "on"
PIP_NO_CACHE_DIR truthy な値か falsy な値ならキャッシュを生成しない "off"

※非空なら: 空でない文字列がセットされたら

PIP_NO_CACHE_DIR には少し注意が必要です。 記事執筆時点で最新の pip 21.1.1 の場合は「 truthy な値か falsy な値をセットするとキャッシュを生成しない」という挙動をします。 truthy な値と falsy な値というのは具体的には次のものを指します:

  • truthy な値: y yes t true on 1
  • falsy な値: n no f false no 0

truthy な値でも falsy な値でも同じ挙動になるのはとても気持ち悪いのですが、これは後方互換性を保つための処置のようです。 もともと PIP_NO_CACHE_DIR は falsy な値のみを受け取るようになっていて、「 falsy な値をセットするとキャッシュを無効にする」(変数名が no cache なのに!)という直感と反する挙動をしていました。

具体的には pip18.119.0 が分かれ目のようです:

  • 18.1 以前: falsy な値( false no off など)がセットされていればキャッシュを無効化する。 truthy な値がセットされていればクラッシュする(=バグ)。
  • 19.0 以降: truthy な値か falsy な値(!)がセットされていたらキャッシュを無効化する。

2021 年時点では pip18.1 以前を使う機会はほとんど無さそうなので、新たなプロジェクトでは通常は直感的な PIP_NO_CACHE_DIR=on という形で使うのがよさそうですが、古いバージョンの pip を使う可能性がある場合は互換性のために PIP_NO_CACHE_DIR=off とする必要があります。

サンプル

これらの変数を Dockerfile でセットすると次のようになります:

pip 21 を使う場合:

FROM python:3.9

ENV PYTHONDONTWRITEBYTECODE=1 \
  PYTHONUNBUFFERED=1 \
  PYTHONUTF8=1 \
  PYTHONIOENCODING="UTF-8" \
  PYTHONBREAKPOINT="IPython.terminal.debugger.set_trace" \
  PIP_NO_CACHE_DIR=off \
  PIP_DISABLE_PIP_VERSION_CHECK=on

pip < 19 をサポートする場合:

FROM python:3.9

ENV PYTHONDONTWRITEBYTECODE=1 \
  PYTHONUNBUFFERED=1 \
  PYTHONUTF8=1 \
  PYTHONIOENCODING="UTF-8" \
  PYTHONBREAKPOINT="IPython.terminal.debugger.set_trace" \
  PIP_NO_CACHE_DIR=on \
  PIP_DISABLE_PIP_VERSION_CHECK=on

なお、 IPython.terminal.debugger.set_trace の利用には ipython パッケージが必要です。

ということで Docker x Python を使うときに有用な環境変数についてでした。 またときどき更新していきます。

参考

Python 関係の環境変数について

pip 関係の設定変数について

pipPIP_NO_CACHE_DIR 周りの挙動について