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 なのに!)という直感と反する挙動をしていました。
具体的には pip
の 18.1
と 19.0
が分かれ目のようです:
18.1
以前: falsy な値(false
no
off
など)がセットされていればキャッシュを無効化する。 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=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
関係の設定変数について
pip
の PIP_NO_CACHE_DIR
周りの挙動について
- Make
PIP_NO_CACHE_DIR
behave as it reads, and not crash pip by cjerdonek · Pull Request #5884 · pypa/pip · GitHub - Make
PIP_NO_CACHE_DIR
disable the cache also if given a "true" value. · pypa/pip@b94d719 · GitHub - Fixed incorrect treatment of options with
action="store_false"
inpip.conf
by 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