poetry バージョン2.0.0 のDocker環境でbuildする方法
過去作成済みのプロジェクトをdocker compose up -dで起動しようとたら以下のようなエラーが出て起動しなくなってしまった。
Installing the current project: hoge-pj (0.1.0)
Error: The current project could not be installed: No file/folder found for package hoge-pj
If you do not want to install the current project use --no-root.
If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.
If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.
------
failed to solve: process "/bin/sh -c poetry install --no-interaction --no-ansi" did not complete successfully: exit code: 1
TL;DR
pyproject.tomlの[tool.poetry]セクションにて、package-mode = falseとする。
# pyproject.toml
[tool.poetry]
package-mode = false
▼ エラー内容: ”パッケージが見つからないよ”
今回遭遇したエラーは”パッケージが見つかりませんよ”というエラーである。これはpoetry2.0.0から発生するエラーで、パッケージのインストールに関する挙動がwarnだったがエラーを出力するように変わった。
2025/01/05にpoetryのバージョン2.0.0がリリースされたため、特にバージョン指定せずにpoetry installしているプロダクトはおのずと2.0.0のpoetry をinstallすることになる。
もともとのDockerFileでは以下のようにpipによるpoetry installを行っていた。
# DockerFile
FROM python:3.12-slim-bookworm
WORKDIR /app
# Poetry インストール
RUN pip install --no-cache-dir poetry
# 以下略
パッケージモードとは?
poetryは管理する対象のプロジェクトをPythonパッケージとして管理することができ、プロジェクトをsdist または Wheel にパッケージ化し、場合によってはパッケージ インデックスに公開する場合に使用できる。デフォルトのモードはパッケージモードとなる。
poetryをパッケージ管理にだけ利用し、特にパッケージを作っていない場合は、package-mode=Falseとすると良さそう。
▼ 対処
パターン1. package-modeをfalseにする
poetry1.X系と同じような挙動にするための対処作。pyproject.tomlの[tool.poetry]セクションにて、package-mode = falseとすることでPoetry を依存関係の管理にのみ使用し、パッケージ化には使用しない場合は、非パッケージモードとして使用可能となる。
# pyproject.toml
[tool.poetry]
package-mode = false
パターン2. package-modeでパッケージを指定する
poetry2系になって他プロジェクトからパッケージとして活用されうる場合の対処作。
[tool.poetry]
# ...
packages = [
{ include = "my_package" },
{ include = "extra_package/**/*.py" },
]
実際には既存のプロジェクトはsrcなどのフォルダ名にしているので、ちょっとダサいが、{ include = "src" }のような記述にしないといけない。
ちなみにexcludeを利用すると特定のファイルを除外するような事もできる。
[tool.poetry]
# ...
packages = [
{ exclude = "data" },
]
パターン3. DockerFile内でpoetry バージョン1系を指定する
こちらを参考に、Dockerfileでpoetryをpip install する箇所でpoetryのバージョンを1系にすると(1系で最新版は1.8.5)、暫定的ではあるがbuildできる。
curlインストールする場合(公式で推奨)
# DockerFile
FROM python:3.12-slim-bookworm
WORKDIR /app
# Poetry 1.8.5 のインストール
curl -sSL https://install.python-poetry.org | python3 - --version 1.8.5
curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.8.5 python3 -
# 以下略
pipで installする場合(公式にはpipxが推奨されている)
# DockerFile
FROM python:3.12-slim-bookworm
WORKDIR /app
# Poetry 1.8.5 のインストール
RUN pip install --no-cache-dir poetry==1.8.5
# 以下略
curlインストールする場合
# DockerFile
FROM python:3.12-slim-bookworm
WORKDIR /app
# Poetry 1.8.5 のインストール
curl -sSL https://install.python-poetry.org | python3 - --version 1.8.4
curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.8.4 python3 -
# 以下略
▼ 学び
poetryもちゃんとバージョン指定しておこうね。
参考
Discussion