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
とする。
▼ エラー内容: ”パッケージが見つからないよ”
今回遭遇したエラーは”パッケージが見つかりませんよ”というエラーである。これは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でパッケージを指定する
[tool.poetry]
# ...
packages = [
{ include = "my_package" },
{ include = "extra_package/**/*.py" },
]
実際には既存のプロジェクトはsrc
などのフォルダ名にしているので、ちょっとダサいが、{ include = "src" }
のような記述にしないといけない。
ちなみにexclude
を利用すると特定のファイルを除外するような事もできる。
[tool.poetry]
# ...
packages = [
{ exclude = "data" },
]
パターン2. package-modeをfalseにする
pyproject.toml
の[tool.poetry]セクションにて、package-mode = false
とすることで
こうすることでPoetry を依存関係の管理にのみ使用し、パッケージ化には使用しない場合は、非パッケージモードとして使用可能となる。
# pyproject.toml
[tool.poetry]
package-mode = false
パターン3. DockerFile内でpoetry バージョン1系を指定する
こちらを参考に、Dockerfileでpoetryをpip install する箇所でpoetryのバージョンを1系にすると(1系で最新版は1.8.5)、暫定的ではあるがbuildできる。
# DockerFile
FROM python:3.12-slim-bookworm
WORKDIR /app
# Poetry 1.8.5 のインストール
RUN pip install --no-cache-dir poetry==1.8.5
# 以下略
▼ 学び
poetryもちゃんとバージョン指定しておこうね。
参考
Discussion