LoginSignup
46
37

More than 1 year has passed since last update.

Dockerコンテナにパッケージ管理ツールpoetryを使ってPythonの分析環境を構築する方法

Last updated at Posted at 2020-01-13

昨年のとあるアドベントカレンダーでPythonのパッケージ管理ツールの一つpoetryが紹介されていました。
2020 年の Python パッケージ管理ベストプラクティス
普段業務で使っているのはpipenvなのですが、パッケージを作るのにsetup.pyとかその他諸々のファイルが必要で面倒だったり、pipfile.lockの作成に異常に時間がかかったりしていてストレスを感じていましたが、poetryだとそれらがいい具合に解決されている?とのことだったので試してみました。
poetryを使ってDockerコンテナに分析環境を構築したので、その方法をメモします。
コードはこちらにあげています。

解説

ディレクトリ構造は以下の通りです。

tree
.
├── 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

設定ファイル群Dockerfiledocker-compose.ymlpyproject.tomlは以下の通りです。

pyproject.toml

pandasnumpysklearnmatplotlibといったパッケージを入れています。
また、開発用にpytestも入れています。
※他パッケージの追加方法に関しては後述

pyproject.toml
[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の依存関係をみながらパッケージをインストールします。

Dockerfile
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を起動します。

docker-compose.yml
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を使って開発していこうと思いました。

46
37
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
37