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

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

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

名前が PYTHON で始まるものは Python 本体、 PIP_ で始まるものは pip のための変数です。

変数名 意味
PYTHONDONTWRITEBYTECODE 非空なら .pyc を生成しない 1
PYTHONUNBUFFERED 非空なら標準出力・標準エラーのストリームのバッファリングを行わない 1
PYTHONUTF8 1 ならインタプリタの UTF-8 モードを有効にする 1
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 \
  PIP_NO_CACHE_DIR=off \
  PIP_DISABLE_PIP_VERSION_CHECK=on

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

FROM python:3.9

ENV PYTHONDONTWRITEBYTECODE=1 \
  PYTHONUNBUFFERED=1 \
  PYTHONUTF8=1 \
  PIP_NO_CACHE_DIR=on \
  PIP_DISABLE_PIP_VERSION_CHECK=on

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

参考

Python と pip の設定変数について

pipPIP_NO_CACHE_DIR 周りの挙動について