🐳

poetry バージョン2.0.0 のDocker環境でbuildできなくなった

2025/01/21に公開

過去作成済みのプロジェクトを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もちゃんとバージョン指定しておこうね。


参考

https://www.m3tech.blog/entry/2025/01/09/110000
https://python-poetry.org/docs/basic-usage/#operating-modes
https://zenn.dev/atsukish/articles/bdb235c7466e42

Discussion