🐍

コンテナ内の既存pythonプロジェクトのパッケージ管理だけpip-toolsからpoetryに移行した

2024/04/27に公開

概要

タイトルの通りです。

私の場合localマシンに色々なライブラリをinstallしたくないので、基本コンテナを利用します。

なので

ryeやpoetryなどでデフォルトで有効になっている仮想環境は邪魔

です。

一方で、これまで利用してきたpip-toolsは、コンパイルエラーに悩まされることも多くなってきたので、パッケージ管理はpoetryかryeかuvへの移行をするべきだと思ってました。

そして、poetryとryeとuvを試した結果、poetryを採用することに決めました。

なので、同じような状況で悩んでいる人のために記録を残しておきます。

この記事は

  • pythonプロジェクトをdockerコンテナで動かしている
  • コンテナ内でpythonプロジェクトを動作させているのでpythonの仮想環境は不要
  • pythonの仮想環境はいらないけど、パッケージは厳密に管理したい

という人に向けた記事になっています

pip-toolsからpoetryの移行方法

開発環境

この記事での開発環境は以下になります。

  • docker imaga python:3.12.3-bullseye
  • pythonプロジェクトはpip-toolsでパッケージを管理

poetryのinstall

まず既存プロジェクトにpoetryをインストールします。

私の手元のプロジェクトでは

python:3.12.3-bullseye

のイメージを使っています。

なので、プロジェクトのルートフォルダで

pip install poetry

を実行します。

既存プロジェクトのpoetry対応

続いて既存プロジェクトをpoetryに対応させます。

プロジェクトのルートで

poetry init

を実行します。

すると、インタラクティブで色々と質問をされますが、後から修正可能なので全て無視してOKです。

全ての質問を終えるとpyproject.tomlができています。

パッケージ管理だけに使う場合は、pyproject.tomlのpackage-modeをfalseにします。

[tool.poetry]
name = "app"
version = "0.1.0"
description = ""
authors = ["skip"]
readme = "README.md"
package-mode = false

仮想環境の設定を無効にする

poetryの仮想環境を使うとdockerやvscodeを使った設定が冗長になるので、仮想環境の設定を無効にします。

以下のコマンドを叩きます。

poetry config virtualenvs.in-project false && poetry config installer.parallel false && poetry config virtualenvs.create false

するとpoetry.lockが作成されます。

ライブラリの移行

既存のプロジェクトに入っているライブラリをpoetryでinstallします。

私はpip-toolsを使っていたので、dev.inファイルに記載されているライブラリを上から順に

poetry add ${hoge}

で実行しました。

この時、ちゃんとライブラリのversion指定をすることも忘れないようにしましょう。

大きなプロジェクトでライブラリが多い場合は、shellで自動実行できるプログラムを作成しても良いと思います。

プロジェクトの実行

ライブラリの移行が終わったらテストを実行します。

うまく移行できていればAll Greenになるはずです。

テストがない人は、手動で頑張ってください

DockerFileの修正

最後はDockerFileをpoetryに対応させます。

以下のようになります。

FROM python:3.12.3-bullseye as builder

# Default to UTF-8 file.encoding
ENV LANG C.UTF-8

# app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app/

COPY ./pyproject.toml ./poetry.lock* ./

# poetryをinstallしてpoetryの設定をする(venv のファイルをプロジェクトディレクトリの下には置かない、並行installをしない、venv を作らずグローバルにパッケージをインストールしてライブラリインストール)
RUN pip install poetry \
  && poetry config virtualenvs.in-project false && poetry config installer.parallel false && poetry config virtualenvs.create false && poetry install --no-root

EXPOSE 8080

シンプルですね。

pip-toolsと比較するとpoetry configの設定が必要なので少しDockerFileが複雑になってしまいますが、ryeやuvと比べるとDockerfileもスッキリしています。

記述が終わったらbuildして再度テストを実行してみましょう。

All Greenになれば成功です。

お疲れ様でした。

まとめ

最近のpythonではpoetry、rye、uvなど多くの便利ツールが生まれています。

しかし、どれも色々な機能を詰め込みすぎて、一通り理解して取り掛かるのに時間を要するようになっています。

これを買えばあちらも付いてくる

ようなやり方は、長い目で見ると大体失敗に終わります。

なので

  • シンプルな使い方できるか
  • 誰でもすぐにキャッチアップできるか

という視点でライブラリを選択する必要がある時代になっていると思います。

またこの記事は2024年4月時点のものなので、今後rye、uvの方が良い選択肢になっていく未来もありえます。

定期的に最新バージョンを調査してみてください。

以上です。

Discussion