以前書いた
Raspberry PI上のPython-slimコンテナ(Debianベース)でrustc依存のパッケージ構築に苦労した話
の続きになります
面倒な方は結論だけどうぞ
前提条件
OS: Rasbian( on Raspberrypi4 )Docker及びDocker-composeをapt経由でインストール
Dockerfile内にpip経由でbcryptを含むいくつか(主にFlask関係)をインストールする文を書いた
ベースコンテナはpython:3.9-slim
経緯
Rasbian上のPython-slimコンテナをベースに
RUN pip install bcrypt
(正確にはbcryp依存のflask-bcrypt)したところ,rustcがないと怒られたので,rustcを入れてpipでビルドしながらインストールできるようにした
問題
コンテナ容量が1GB近くに跳ね上がる
仮説
RUN apt-get install python3-bcrypt && \
pip install flask-bcrypt -y
すればいいのでは?
結果
apt-getでインストールされたpython3-bcryptが見つからず,bcryptパッケージをビルドしようとしてrustcがないと怒られます
原因
apt-getで入るpython packageは
/usr/lib/python3/dist-packages
もしくは
/usr/lib/python3.9/dist-packages
に入るのに対し,python-slimコンテナで参照されるモジュールパスは(こちら参照)
>>> import sys
>>> print(sys.path)
['', '/usr/local/lib/python39.zip', '/usr/local/lib/python3.9', '/usr/local/lib/python3.9/lib-dynload', '/usr/local/lib/python3.9/site-packages']
ということで,参照される先に入りません(汗)
結論
Dockerfile内のPYTHONPATH環境変数に/usr/lib/python3/dist-packagesと/usr/lib/python3.9/dist-packagesを追加ENV PYTHONPATH="/usr/lib/python3/dist-packages:/usr/lib/python3.9/dist-packages"
RUN apt-get install python3-bcrypt && \
pip install flask-bcrypt
(説明のため簡略化しています.実際には他のパッケージもインストールしてます)