Poetryを使って環境を構築し、Dockerコンテナ内でPythonアプリケーションを実行する際の手順と注意点をまとめました。
CI/CD環境やコンテナビルド時忘れがちところも自分用メモとして記入しましたが参考になれば幸いです。
1. 開発フェーズでのpyproject.toml
まず、開発フェーズでpyproject.tomlを作成します。このファイルは、後でコンテナやCI/CD環境でプログラムを実行する際に使用します。
[tool.poetry]
name = "recommendation-practice"
version = "0.1.0"
description = ""
authors = ["PH <phlin@example.com>"]
packages = [
{include = "datareadeor", from = "src"},
{include = "utils", from = "src"},
{include = "core", from = "src"},
{include = "table_models", from = "src"}
]
[tool.poetry.dependencies]
python = "^3.11"
numpy = "^1.25"
mlflow = "^2.14.2"
pydantic = "^2.8.2"
joblib = "^1.4.2"
pgvector = "^0.3.0"
psycopg2-binary = "^2.9.9"
asyncpg = "^0.29.0"
greenlet = "^3.0.3"
pydantic-settings = "^2.3.4"
[tool.poetry.group.pipeline.dependencies]
scikit-surprise = "^1.1.4"
[tool.poetry.group.dev.dependencies]
poethepoet = "^0.27.0"
ruff = "^0.5.1"
pandas = "^2.2.2"
ipykernel = "^6.29.5"
matplotlib = "^3.9.1"
pytest = "^8.2.2"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
2. Dockerfile
の作成
次に、上記のpyproject.tomlを使用して、Dockerコンテナを作成します。以下は、Python 3.11のSlimバージョンをベースにしたDockerfileの例です。
FROM python:3.11-slim
WORKDIR /app
RUN mkdir /app/src
# 必要なビルドツールのインストール
RUN apt-get update && apt-get install -y \
build-essential \
gcc \
python3-dev \
libpython3-dev
# Poetryのインストール
RUN pip install --upgrade pip && \
pip install poetry
# Poetryファイルのコピーとパッケージのインストール
COPY src/pipelines/popularity/pyproject.toml /app/pyproject.toml
# モジュールコードのコピー
COPY src /app/src
# パイプラインスクリプトのコピー
COPY src/pipelines/popularity/pipeline_popularity.py /app/src/pipeline_popularity.py
# Poetryを使用して依存関係をインストール
RUN poetry config virtualenvs.in-project true
RUN poetry install --only main
# エントリーポイントスクリプトを使用して、適切なパイプラインを実行
ENTRYPOINT [ "poetry", "run", "python", "src/pipeline.py"]
Dockerfile
に対し自分がよく忘れるポイントは以下:
-
Poetryの仮想環境をワーキングディレクトリに強制的に作成
RUN poetry config virtualenvs.in-project true
-
メイングループのパッケージのみ(
[tool.poetry.dependencies]
に記載されているパッケージ)をインストールRUN poetry install --only main
または、実行したいスクリプトに応じてパッケージをインストールする場合:
RUN poetry install --with pipeline
-
コンテナ内で
poetry run
を使用してスクリプトを実行ENTRYPOINT [ "poetry", "run", "python", "src/pipeline_popularity.py"]
-
README.mdファイルの準備を忘れずに。README.mdがなければ
poetry install
の段階でエラーが発生します -
パッケージ依存関係を指定した(
[tool.poetry]
の下でpackages
に記載されている依存関係 )場合、以下の引数を使わないpoetry install --no-root