はじめに
PHP
だと Composer、JavaScript
だと NPM といったパッケージマネージャーがあります。
Python
だとそれが、 pip になるわけですが、Composer
やNPM
と違い、(標準では)プロジェクト別のパスにパッケージをインストールしないので、複数プロジェクトを管理するのが難しくなったりします。
この記事では、Python
プロジェクトの依存パッケージをプロジェクト別のパスにインストールし、Docker
化する方法について記載します。
構成
シンプルなFlask
のアプリをビルド、起動します。
docker-compose.yml
version: "3"
services:
app:
build: .
working_dir: /app
volumes:
- ./app:/app:cached
- ./vendor:/vendor:cached
expose:
- 5000
ports:
- 127.0.0.1:5000:5000
environment:
PYTHONUSERBASE: /vendor
PATH: $PATH:/vendor/bin
Dockerfile
FROM python:3-slim
RUN apt-get update && apt-get install -y build-essential aptitude
# その他、必要なものをインストール
app/requirements.txt
boto3
Flask
vendor/.gitignore
*
!.gitignore
app/main.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello !!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
Makefile
install:
docker-compose build --no-cache
docker-compose run --rm app pip install -r requirements.txt --user
run:
docker-compose run --rm --service-ports app python main.py
ローカルで、プロジェクトをビルドし、Flask
アプリを起動するには、以下のコマンドを実行します。
$ make install && make run
ポイント
ポイントは以下の2点です。
-
pip install
する際に--user
オプションを付与 - 環境変数
PYTHONUSERBASE
にプロジェクトごとのパッケージをインストールするパスを指定する
参考にしたリンク
おわりに
Composer
だと vendor
、JavaScript
だと、 node_modules
ようにサブディレクトリに依存パッケージがインストールされるので、Python
もそういう風にできないかなと思って調べていたら、やり方が見つかったので、記事にしてみました。
誰かのお役に立てれば幸いです。
ではでは。