当サイトは、アフィリエイト広告を利用しています
Docker環境でFastApiで開発時、poetryでパッケージをインストールする際に
requirements.txtから対象のパッケージを読み込んで
インストールする方法を調べた。
基本的にはpoetryを使う場合は
「poetry init」コマンドでpyproject.tomlを作成し、
必要なパッケージを「poetry add <パッケージ名>」で追加していくことになる
ただ
場合はrequirements.txtのパッケージを読み込んで
pyproject.tomlを作ったほうがはやい。
当記事ではDockerを使ってFastApiプロジェクトを開発する際に
requirements.txtからpyproject.tomlを作成する方法を解説する。
DockerでFastApiプロジェクトの開発環境をpoetryを使って整えるところ
をメインにまとめるので、FastApiの実装やサーバーでの実行方法については
下記記事参照
またpoetryのコマンドや用語などの基本は下記参照
下記の環境で行う
のインストール方法については下記記事で 紹介しています
全体的なプロジェクト構成は下記のようにする
.|-- app| `-- main.py|-- docker-compose.yml|-- dockerfile|-- requirements.txt`-- script`-- entrypoint.sh
app/main.pyについて環境構築においては不要なので割愛する
重要なのは
なので上記を解説する。
DockerでFastApi開発環境コンテナを作成する。
コンテナ作成時に同時にscriptを使ってpoetryでFastApiプロジェクトに
必要なパッケージもインストールする
流れとしてはとしては
のようなイメージ
version: "3"services:fastapi-poetry:container_name: "fastapi-poetry"build:context: .dockerfile: Dockerfilevolumes:- .:/workspacetty: true# コンテナの環境変数設定environment:- PROJECT_NAME=fastapi-poetryports:- 8000:8000 # ホストマシンのポート8000を、docker内のポート8000に接続する
# ベースイメージとしてPythonを使用FROM python:3.12 as python-base# 作業ディレクトリを作成WORKDIR /workspace# pipを更新RUN pip install --upgrade pip# PoetryをインストールRUN pip install poetry# スクリプトをコピーCOPY script/entrypoint.sh /workspace/script/# スクリプトを実行するために権限を変更RUN chmod +x /workspace/script/entrypoint.sh# エントリーポイントとしてスクリプトを設定ENTRYPOINT ["/workspace/script/entrypoint.sh"]
ENTRYPOINTにentrypoint.shを指定してスクリプトを実行する
requirements.txtを読み込んでpoetryでパッケージをインストールするスクリプト
#!/bin/sh# pyproject.toml が存在するかチェックif [ ! -f pyproject.toml ]; thenecho "pyproject.toml が存在しないため、生成しています..."# `pyproject.toml` を生成# fastapiを動かすのに最低限の依存関係をインストールpoetry init -n --name "$PROJECT_NAME" --dependency fastapi --dependency uvicorn[standard]echo "pyproject.toml を生成しました。"# requirements.txt が存在する場合のみ依存関係を追加if [ -f requirements.txt ]; thenecho "requirements.txt を検出しました。Poetry を使用して依存関係をインストールします..."poetry add $(cat requirements.txt)echo "requirements.txt から依存関係をインストールしました。"elseecho "requirements.txt が存在しません。"fielseecho "pyproject.toml が既に存在します。requirements.txt からのインストールはスキップされます。"fi# 依存関係をインストールecho "依存関係をインストールしています..."poetry install --no-rootecho "依存関係のインストールが完了しました。"# コンテナが終了しないように待機tail -f /dev/null
実行後は
が作成される
細かく解説する
既にpyproject.tomlが存在する場合は、requirements.txtを読み込んでの
パッケージインストールを実行せずにpyproject.tomlからインストールを実行する
※pyproject.tomlを優先する
pyproject.tomlがない場合はpoetryでパッケージをインストールする前に
作成する必要があるので「poetry init」コマンドでfastapiを動かすのに最低限の依存関係をインストールした
pyproject.tomlを作成する。
※先に作っておかないとエラーになる。
requirements.txtがない場合は、このままインストールは環境になる。
「poetry init」コマンドでfastapiを動かすのに最低限の依存関係をインストールした
pyproject.tomlを作成するところまで同じ。
この後にrequirements.txtを読み込んでrequirements.txtに記載のパッケージを
poetryでインストールする。
pyproject.toml作成時に設定したfastapiを動かすのに最低限のパッケージと
requirements.txtのパッケージが重複していた場合は、requirements.txtが優先される
実際に
にパターンでコンテナを作りコンテナのログを確認してみる
.|-- app| `-- main.py|-- docker-compose.yml|-- dockerfile|-- poetry.lock|-- pyproject.toml|-- requirements.txt`-- script`-- entrypoint.sh
pyproject.tomlを作成しておく
$ docker logs fastapi-poetrypyproject.toml が既に存在します。requirements.txt からのインストールはスキップされます。依存関係をインストールしています...Creating virtualenv fastapi-poetry-xS3fZVNL-py3.12 in /root/.cache/pypoetry/virtualenvsInstalling dependencies from lock filePackage operations: 24 installs, 0 updates, 0 removals- Installing typing-extensions (4.12.2)- Installing annotated-types (0.7.0)- Installing dnspython (2.7.0)- Installing idna (3.10)- Installing pydantic-core (2.23.4)- Installing sniffio (1.3.1)- Installing anyio (4.6.2.post1)- Installing pydantic (2.9.2)- Installing pymongo (4.9.2)- Installing click (8.1.7)- Installing h11 (0.14.0)- Installing httptools (0.6.4)- Installing lazy-model (0.2.0)- Installing motor (3.6.0)- Installing python-dotenv (1.0.1)- Installing pyyaml (6.0.2)- Installing starlette (0.41.2)- Installing toml (0.10.2)- Installing uvloop (0.21.0)- Installing watchfiles (0.24.0)- Installing websockets (13.1)- Installing beanie (1.27.0)- Installing fastapi (0.115.3)- Installing uvicorn (0.32.0)依存関係のインストールが完了しました。
requirements.txtがスキップされている
.|-- app| `-- main.py|-- docker-compose.yml|-- dockerfile`-- script`-- entrypoint.sh
pyproject.tomlもrequirements.txtもない状態にする
$ docker logs fastapi-poetrypyproject.toml が存在しないため、生成しています...Using version ^0.115.4 for fastapiUsing version ^0.32.0 for uvicornpyproject.toml を生成しました。requirements.txt が存在しません。依存関係をインストールしています...Creating virtualenv fastapi-poetry-xS3fZVNL-py3.12 in /root/.cache/pypoetry/virtualenvsUpdating dependenciesResolving dependencies... (2.5s)Package operations: 18 installs, 0 updates, 0 removals- Installing idna (3.10)- Installing sniffio (1.3.1)- Installing typing-extensions (4.12.2)- Installing annotated-types (0.7.0)- Installing anyio (4.6.2.post1)- Installing pydantic-core (2.23.4)- Installing click (8.1.7)- Installing h11 (0.14.0)- Installing httptools (0.6.4)- Installing pydantic (2.9.2)- Installing python-dotenv (1.0.1)- Installing pyyaml (6.0.2)- Installing starlette (0.41.2)- Installing uvloop (0.21.0)- Installing watchfiles (0.24.0)- Installing websockets (13.1)- Installing fastapi (0.115.4)- Installing uvicorn (0.32.0)Writing lock file依存関係のインストールが完了しました。
pyproject.tomlは生成してるが、requirements.txtないのでスキップしている
.|-- app| `-- main.py|-- docker-compose.yml|-- dockerfile|-- poetry.lock|-- pyproject.toml`-- script`-- entrypoint.sh
pyproject.tomlが作成されている
[tool.poetry]name = "fastapi-poetry"version = "0.1.0"description = ""authors = ["Your Name <you@example.com>"]readme = "README.md"[tool.poetry.dependencies]python = "^3.12"fastapi = "^0.115.4"uvicorn = {extras = ["standard"], version = "^0.32.0"}[build-system]requires = ["poetry-core"]build-backend = "poetry.core.masonry.api"
最低限必要なパッケージであるfastapiとuvicornがインストールされている
.|-- app| `-- main.py|-- docker-compose.yml|-- dockerfile|-- requirements.txt`-- script`-- entrypoint.sh
requirements.txtのみ作っておく
fastapiuvicorn[standard]beanierequests
beanieとrequestのパッケージを追加する
$ docker logs fastapi-poetrypyproject.toml が存在しないため、生成しています...Using version ^0.115.4 for fastapiUsing version ^0.32.0 for uvicornpyproject.toml を生成しました。requirements.txt を検出しました。Poetry を使用して依存関係をインストールします...Creating virtualenv fastapi-poetry-xS3fZVNL-py3.12 in /root/.cache/pypoetry/virtualenvsUsing version ^0.115.4 for fastapiUsing version ^0.32.0 for uvicornUsing version ^1.27.0 for beanieUsing version ^2.32.3 for requestsUpdating dependenciesResolving dependencies... (8.5s)Package operations: 28 installs, 0 updates, 0 removals- Installing typing-extensions (4.12.2)- Installing annotated-types (0.7.0)- Installing dnspython (2.7.0)- Installing idna (3.10)- Installing pydantic-core (2.23.4)- Installing sniffio (1.3.1)- Installing anyio (4.6.2.post1)- Installing pydantic (2.9.2)- Installing pymongo (4.9.2)- Installing certifi (2024.8.30)- Installing charset-normalizer (3.4.0)- Installing click (8.1.7)- Installing h11 (0.14.0)- Installing httptools (0.6.4)- Installing lazy-model (0.2.0)- Installing motor (3.6.0)- Installing python-dotenv (1.0.1)- Installing pyyaml (6.0.2)- Installing starlette (0.41.2)- Installing toml (0.10.2)- Installing urllib3 (2.2.3)- Installing uvloop (0.21.0)- Installing watchfiles (0.24.0)- Installing websockets (13.1)- Installing beanie (1.27.0)- Installing fastapi (0.115.4)- Installing requests (2.32.3)- Installing uvicorn (0.32.0)Writing lock filerequirements.txt から依存関係をインストールしました。依存関係をインストールしています...Installing dependencies from lock file
requirements.txtを読み込んでインストールしている
.|-- app| `-- main.py|-- docker-compose.yml|-- dockerfile|-- poetry.lock|-- pyproject.toml|-- requirements.txt`-- script`-- entrypoint.sh
pyproject.tomlが作成されている
[tool.poetry]name = "fastapi-poetry"version = "0.1.0"description = ""authors = ["Your Name <you@example.com>"]readme = "README.md"[tool.poetry.dependencies]python = "^3.12"fastapi = "^0.115.4"uvicorn = {extras = ["standard"], version = "^0.32.0"}beanie = "^1.27.0"requests = "^2.32.3"[build-system]requires = ["poetry-core"]build-backend = "poetry.core.masonry.api"
requirements.txtに書いた
beanieとrequestのパッケージを追加されている。
poetryでrequirements.txtを使ってパッケージを
インストールする方法をまとめてみた。
poetryはpipに比べて、依存関係の自動解決だとを
行ってくれるので使うことが増えてきているので
pipでの管理から移行する際は便利だと思う。