[Django]Docker Composeでpip installしても認識されない

解決したいこと

# zsh

% docker-compose run --rm web pip install python-dotenv 
Creating docker_sample_web_run ... done
Collecting python-dotenv
  Downloading python_dotenv-0.15.0-py2.py3-none-any.whl (18 kB)
Installing collected packages: python-dotenv
Successfully installed python-dotenv-0.15.0

いかにもインストールに成功してそうなのに、実際に動かすと起動時に、from dotenv(pip installしたパッケージ)でエラーになるという問題。

調査

Dockerにはインストールできているが、PyCharm で読み込めていないことが原因なのか、そもそもDockerにもインストールできてないのかの切り分けをする必要があった。

Docker でインストールできているかどうかの確認。

# zsh

% docker-compose run --rm web pip show python-dotenv
Creating docker_sample_web_run ... done
WARNING: Package(s) not found: python-dotenv

not found で pip install時にインストールに成功してそうだったが実際にはインストールできていないことがわかった。

PyCharm > Preferences > Project > Python InterpreterのPackage一覧にもpython-dotenvが表示されてない。

ググったけどパッと出てこない。Rails で Docker構築をした時にも同様の事象を対応していて永続化が必要なことを思い出したので、過去のソースをみて書き方を思い出した。

永続化するディレクトリを指定する必要があるので、Imageのビルド時にpip installしているものの保存先を確認する。

# zsh

% docker-compose run --rm web pip show psycopg2                 
Creating docker_sample_web_run ... done
Name: psycopg2
Version: 2.8.6
Summary: psycopg2 - Python-PostgreSQL Database Adapter
Home-page: https://psycopg.org/
Author: Federico Di Gregorio
Author-email: fog@initd.org
License: LGPL with exceptions
Location: /usr/local/lib/python3.9/site-packages
Requires: 
Required-by:

/usr/local/lib/python3.9/site-packages にpip installしたものが入っているので、これを永続化する。

# docker-compose.yml

version: '3.8'

services:
  db:
    image: postgres:12.0-alpine
    volumes:
     - db-data:/var/lib/postgresql/data
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
      - site-packages:/usr/local/lib/python3.9/site-packages
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  db-data:
  site-packages:

docker-compose.yml に site-packages が含まれる行を追加した。
再度 pip installしてpip showで確認

# zsh

% docker-compose run --rm web pip install python-dotenv 
Creating docker_sample_web_run ... done
Collecting python-dotenv
  Downloading python_dotenv-0.15.0-py2.py3-none-any.whl (18 kB)
Installing collected packages: python-dotenv
Successfully installed python-dotenv-0.15.0

% docker-compose run --rm web pip show python-dotenv
Creating docker_sample_web_run ... done
Name: python-dotenv
Version: 0.15.0
Summary: Add .env support to your django/flask apps in development and deployments
Home-page: https://github.com/theskumar/python-dotenv
Author: Saurabh Kumar
Author-email: me+github@saurabh-kumar.com
License: UNKNOWN
Location: /usr/local/lib/python3.9/site-packages
Requires: 
Required-by:

無事インストールできて、確認もできた。PyCharmのPackageにも追加されていることを確認した。
サーバーを起動してみる。。。成功

感想

パッケージ・ライブラリ管理を永続ボリュームで管理するようにするのはクセにしたい。毎回というほど頻度は高くないが、毎回ハマっている。
pip を使うパターンは今回雛形もできたのでよかった。
実際には、 requirements.txt で管理していて、毎回 pip install -r requirements.txt するのは面倒なので、起動時に実行されるようにしたい。 entrypoint を使えばできたはず。そのうちやろう。

コメント