昨年のとあるアドベントカレンダーでPythonのパッケージ管理ツールの一つpoetryが紹介されていました。
2020 年の Python パッケージ管理ベストプラクティス
普段業務で使っているのはpipenvなのですが、パッケージを作るのにsetup.pyとかその他諸々のファイルが必要で面倒だったり、pipfile.lockの作成に異常に時間がかかったりしていてストレスを感じていましたが、poetryだとそれらがいい具合に解決されている?とのことだったので試してみました。
poetryを使ってDockerコンテナに分析環境を構築したので、その方法をメモします。
コードはこちらにあげています。
解説
ディレクトリ構造は以下の通りです。
.
├── Dockerfile
├── README.md
├── docker-compose.yml
├── notebook # EDAで使用するnotebook
│ └── eda.ipynb
├── poetry.lock
├── pyproject.toml
├── src # パッケージ化したいモジュール
│ ├── __init__.py
│ └── helloworld.py
└── tests # テストコード
├── __init__.py
└── test_helloworld.py
設定ファイル群Dockerfile、docker-compose.yml、pyproject.tomlは以下の通りです。
pyproject.toml
pandas、numpy、sklearn、matplotlibといったパッケージを入れています。
また、開発用にpytestも入れています。
※他パッケージの追加方法に関しては後述
[tool.poetry]
name = "poetry_docker"
version = "0.1.0"
description = ""
authors = ["yolo-kiyoshi"]
[tool.poetry.dependencies]
python = "^3.9"
sklearn = "^0.0"
jupyterlab = "*"
pandas = "*"
numpy = "*"
matplotlib = "*"
seaborn = "*"
japanize-matplotlib = "*"
[tool.poetry.dev-dependencies]
pytest = "^5.2"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
Dockerfile
poetryはデフォルトで仮想環境venvを構築しますが、Dockerコンテナにわざわざvenvを構築する必要はないので、poetry config virtualenvs.create falseによってコンテナ上に直にパッケージをインストールするようにしてます1。
その後、poetry installによってpoetry.lockの依存関係をみながらパッケージをインストールします。
FROM python:3.9-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY poetry.lock pyproject.toml ./
RUN pip install poetry
RUN poetry config virtualenvs.create false \
&& poetry install
docker-compose.yml
portsでローカルport8888とコンテナport8888を接続し、commandでjupyterを起動します。
version: '3'
services:
eda:
build: ./
user: root
volumes:
- ./:/app
working_dir: /app
ports:
- "8888:8888"
command: jupyter lab --ip=0.0.0.0 --allow-root --NotebookApp.token='' --port=8888
使い方
ソース一式をローカルにcloneします。
git clone https://github.com/yolo-kiyoshi/poetry_docker.git
ビルドとコンテナ起動
以下のコマンドによりDockerイメージのビルドとコンテナを起動できます。
docker-compose up -d
※Dockerfileを変更しリビルドしたい場合、docker-compose up -d --buildを実行します
jupyterへのアクセス
コンテナ実行後、以下にアクセスすることでJupyter labにアクセスできます。
http://localhost:8888/lab
テスト実行
以下のコマンドでtests/配下のテストコードを実行できます。
pytest
※pytestの詳しい使い方は以下がわかりやすいです。
pytest ヘビー🐍ユーザーへの第一歩
パッケージの追加
以下のコマンドでPythonパッケージを追加できます。
poetry add <追加したいパッケージ>
感想
poetry 使いやすいと思います。
パッケージ作成が容易になったのもいいのですが、何よりpipenvよりも.lockファイル作成にかかる時間が短いなと感じます2。
今年はバンバンpoetryを使って開発していこうと思いました。
-
PipenvとPoetryを比較した記事 Pipenv and Poetry: Benchmarks & Ergonomics ↩