Poetry v2.0 リリース後の Docker 環境を救う簡単な暫定対処法
はじめに
2025 年 1 月 5 日に Poetry version 2.0 の安定版がリリースされました。
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 /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY /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 系に準拠させることですので、あくまで暫定的な対応として参考にしていただければ幸いです。
参考
Discussion