はじめに
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 もそういう風にできないかなと思って調べていたら、やり方が見つかったので、記事にしてみました。
誰かのお役に立てれば幸いです。
ではでは。