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 な値:
yyesttrueon1 - falsy な値:
nnoffalseno0
truthy な値でも falsy な値でも同じ挙動になるのはとても気持ち悪いのですが、これは後方互換性を保つための処置のようです。
もともと PIP_NO_CACHE_DIR は falsy な値のみを受け取るようになっていて、「 falsy な値をセットするとキャッシュを無効にする」(変数名が no cache なのに!)という直感と反する挙動をしていました。
具体的には pip の 18.1 と 19.0 が分かれ目のようです:
18.1以前: falsy な値(falsenooffなど)がセットされていればキャッシュを無効化する。 truthy な値がセットされていればクラッシュする(=バグ)。19.0以降: truthy な値か falsy な値(!)がセットされていたらキャッシュを無効化する。
2021 年時点では pip の 18.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=onpip < 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 関係の設定変数について
pip の PIP_NO_CACHE_DIR 周りの挙動について
- Make
PIP_NO_CACHE_DIRbehave as it reads, and not crash pip by cjerdonek · Pull Request #5884 · pypa/pip · GitHub - Make
PIP_NO_CACHE_DIRdisable the cache also if given a "true" value. · pypa/pip@b94d719 · GitHub - Fixed incorrect treatment of options with
action="store_false"inpip.confby KOLANICH · Pull Request #7735 · pypa/pip · GitHub - Allow "true" values for pip.conf negative options (no-cache-dir and no-compile) · Issue #5011 · pypa/pip · GitHub