昨年のとあるアドベントカレンダーで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 ↩