🐳

Poetry v2.0 リリース後の Docker 環境を救う簡単な暫定対処法

2025/01/07に公開

はじめに

2025 年 1 月 5 日に Poetry version 2.0 の安定版がリリースされました。

https://python-poetry.org/history/#200---2025-01-05

pyproject.toml の記述方法が PEP 621 に準拠したものに変更されるなど、v1 系と v2 系では大きな変更が幾つかあります。それに伴い、Poetry v1 系で開発していたアプリケーションを docker コンテナとして利用する場合、これまで通りの Dockerfile ではビルドができないことがあります。

この記事では v1 系で利用していた Dockerfile を v2 系でビルドできるようにする方法を紹介します。

Version 1 系で利用していた Dockerfile

私がこれまで Poetry v1 系で使っていた Dockerfile は以下のとおりです。
マルチステージ構成になっています。builder ステージで curl 経由で Poetry をインストールし、poetry install --only mainで依存パッケージをインストールし、deploy ステージで依存パッケージをコピーしています。

##########################################
# build base image
##########################################
FROM python:3.11.9-slim AS builder

RUN apt-get -y update && apt-get install -y --no-install-recommends \
    curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# install poetry
RUN curl -sSL https://install.python-poetry.org | python -
ENV PATH=/root/.local/bin:$PATH

WORKDIR /workspace
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false
RUN poetry install --only main

RUN rm -rf /root/.cache/pypoetry/*

##########################################
# build deploy image
##########################################
FROM python:3.11.9-slim

RUN apt-get -y update && apt-get install -y --no-install-recommends \
    tzdata \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENV PYTHONUNBUFFERED=1
ENV TZ=Asia/Tokyo

WORKDIR /workspace
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin

COPY ./app /workspace/app/
CMD ["gunicorn", "--config", "/workspace/app/gunicorn.conf.py"]

version 2.0 リリース後は、で Poetry は最新安定版である v2 系がインストールされます。v1 系から変更になった pyproject.toml の記述方法に対応していないため、以下のようなエラーが出力されます。

...
119.4 Warning: The current project could not be installed: No file/folder found for package hoge-app
119.4 If you do not want to install the current project use --no-root.
119.4 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.
119.4 If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.
119.4
------
Dockerfile:19
--------------------
  17 |     RUN poetry config virtualenvs.create false
  18 |     RUN poetry --version
  19 | >>> RUN poetry install --only main
  20 |
  21 |     RUN rm -rf /root/.cache/pypoetry/*
--------------------
ERROR: failed to solve: process "/bin/sh -c poetry install --only main" did not complete successfully: exit code: 1

解決方法 : Poetry version を指定

Poetry version を 1 系に指定してインストールすることで、これまで通りビルドが可能となります。

# Poetry v1.8.0 をインストール
curl -sSL https://install.python-poetry.org | python3 - --version 1.8.0

or

# Poetry v1.8.0 をインストール
curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.8.0 python3 -

まとめ

この記事では Poetry v1 系で利用していた Dockerfile を v2 系でビルドできるようにする方法を紹介しました。
ただし根本対策としては pyproject.toml の記述方法を v2 系に準拠させることですので、あくまで暫定的な対応として参考にしていただければ幸いです。

参考

https://python-poetry.org/docs/

https://zenn.dev/hikaelis/articles/98c17f52754a64

Discussion