当サイトは、アフィリエイト広告を利用しています

【Docker × FastAPI × Poetry】requirements.txtでインストールする方法

作成日:2024月10月28日
更新日:2024年10月28日

Docker環境でFastApiで開発時、poetryでパッケージをインストールする際に
requirements.txtから対象のパッケージを読み込んで
インストールする方法を調べた。

基本的にはpoetryを使う場合は
「poetry init」コマンドでpyproject.tomlを作成し、
必要なパッケージを「poetry add <パッケージ名>」で追加していくことになる

ただ

  • 必要なパッケージが大量にある
  • 今まではpipとrequirements.txtで管理していたプロジェクトをpoetry管理に変える

場合はrequirements.txtのパッケージを読み込んで
pyproject.tomlを作ったほうがはやい。

当記事ではDockerを使ってFastApiプロジェクトを開発する際に
requirements.txtからpyproject.tomlを作成する方法を解説する。

DockerでFastApiプロジェクトの開発環境をpoetryを使って整えるところ をメインにまとめるので、FastApiの実装やサーバーでの実行方法については
下記記事参照

またpoetryのコマンドや用語などの基本は下記参照

環境

下記の環境で行う

  • Windows10
  • Docker version 24.0.2(Docker for Windows)
  • VScode
  • Remote Development(VScodeの拡張機能)
  • fastapi 0.114.1
  • poetry 1.8.3
  • Docker for Windows

のインストール方法については下記記事で 紹介しています

構成

全体的なプロジェクト構成は下記のようにする

bash
.
|-- app
| `-- main.py
|-- docker-compose.yml
|-- dockerfile
|-- requirements.txt
`-- script
`-- entrypoint.sh

app/main.pyについて環境構築においては不要なので割愛する
重要なのは

  • docker-compose.yml
  • dockerfile
  • requirements.txt
  • script/entrypoint.sh

なので上記を解説する。

コンテナ作成方法

DockerでFastApi開発環境コンテナを作成する。
コンテナ作成時に同時にscriptを使ってpoetryでFastApiプロジェクトに
必要なパッケージもインストールする

流れとしてはとしては

  1. docker-composeでコンテナ作成開始
  2. dockerfileでイメージを作成開始
  3. dockerfileでイメージ作成時にスクリプト実行
  4. スクリプトでrequirements.txtを読み込み、poetryでインストール
  5. pyproject.tomlとpoetry.lockが作成される
  6. コンテナ作成完了

のようなイメージ

docker-compose.yml

docker-compose.yml
version: "3"
services:
fastapi-poetry:
container_name: "fastapi-poetry"
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/workspace
tty: true
# コンテナの環境変数設定
environment:
- PROJECT_NAME=fastapi-poetry
ports:
- 8000:8000 # ホストマシンのポート8000を、docker内のポート8000に接続する
  • コンテナはDockerfileで作成したイメージを元に作るように設定する
  • コンテナには環境変数としてPROJECT_NAME=fastapi-poetryを設定しておく

Dockerfile

Dockerfile
# ベースイメージとして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を指定してスクリプトを実行する

script/entrypoint.sh

requirements.txtを読み込んでpoetryでパッケージをインストールするスクリプト

script/entrypoint.sh
#!/bin/sh
# pyproject.toml が存在するかチェック
if [ ! -f pyproject.toml ]; then
echo "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 ]; then
echo "requirements.txt を検出しました。Poetry を使用して依存関係をインストールします..."
poetry add $(cat requirements.txt)
echo "requirements.txt から依存関係をインストールしました。"
else
echo "requirements.txt が存在しません。"
fi
else
echo "pyproject.toml が既に存在します。requirements.txt からのインストールはスキップされます。"
fi
# 依存関係をインストール
echo "依存関係をインストールしています..."
poetry install --no-root
echo "依存関係のインストールが完了しました。"
# コンテナが終了しないように待機
tail -f /dev/null

実行後は

  • pyproject.toml
  • poetry.lock

が作成される

細かく解説する

pyproject.tomlがある場合

既にpyproject.tomlが存在する場合は、requirements.txtを読み込んでの
パッケージインストールを実行せずにpyproject.tomlからインストールを実行する
※pyproject.tomlを優先する

pyproject.tomlがなく、requirements.txtがない場合

pyproject.tomlがない場合はpoetryでパッケージをインストールする前に
作成する必要があるので「poetry init」コマンドでfastapiを動かすのに最低限の依存関係をインストールした
pyproject.tomlを作成する。
※先に作っておかないとエラーになる。

requirements.txtがない場合は、このままインストールは環境になる。

pyproject.tomlがなく、requirements.txtがある場合

「poetry init」コマンドでfastapiを動かすのに最低限の依存関係をインストールした
pyproject.tomlを作成するところまで同じ。

この後にrequirements.txtを読み込んでrequirements.txtに記載のパッケージを
poetryでインストールする。

pyproject.toml作成時に設定したfastapiを動かすのに最低限のパッケージと
requirements.txtのパッケージが重複していた場合は、requirements.txtが優先される

コンテナ作成

実際に

  • pyproject.tomlがある場合
  • pyproject.tomlがなく、requirements.txtがない場合
  • pyproject.tomlがなく、requirements.txtがある場合

にパターンでコンテナを作りコンテナのログを確認してみる

pyproject.tomlありでコンテナ作成

実行前プロジェクト構成

実行前プロジェクト構成
.
|-- app
| `-- main.py
|-- docker-compose.yml
|-- dockerfile
|-- poetry.lock
|-- pyproject.toml
|-- requirements.txt
`-- script
`-- entrypoint.sh

pyproject.tomlを作成しておく

コンテナのログ

コンテナログ
$ docker logs fastapi-poetry
pyproject.toml が既に存在します。requirements.txt からのインストールはスキップされます。
依存関係をインストールしています...
Creating virtualenv fastapi-poetry-xS3fZVNL-py3.12 in /root/.cache/pypoetry/virtualenvs
Installing dependencies from lock file
Package 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がスキップされている

pyproject.tomlがなし、requirements.txtなしでコンテナ作成

実行前プロジェクト構成

実行前プロジェクト構成
.
|-- app
| `-- main.py
|-- docker-compose.yml
|-- dockerfile
`-- script
`-- entrypoint.sh

pyproject.tomlもrequirements.txtもない状態にする

コンテナログ

ログ
$ docker logs fastapi-poetry
pyproject.toml が存在しないため、生成しています...
Using version ^0.115.4 for fastapi
Using version ^0.32.0 for uvicorn
pyproject.toml を生成しました。
requirements.txt が存在しません。
依存関係をインストールしています...
Creating virtualenv fastapi-poetry-xS3fZVNL-py3.12 in /root/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving 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が作成されている

pyproject.toml

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がインストールされている

pyproject.tomlがなし、requirements.txtありでコンテナ作成

実行前プロジェクト構成

実行前プロジェクト構成
.
|-- app
| `-- main.py
|-- docker-compose.yml
|-- dockerfile
|-- requirements.txt
`-- script
`-- entrypoint.sh

requirements.txtのみ作っておく

requirements.txt

requirements.txt
fastapi
uvicorn[standard]
beanie
requests

beanieとrequestのパッケージを追加する

コンテナログ

コンテナログ
$ docker logs fastapi-poetry
pyproject.toml が存在しないため、生成しています...
Using version ^0.115.4 for fastapi
Using version ^0.32.0 for uvicorn
pyproject.toml を生成しました。
requirements.txt を検出しました。Poetry を使用して依存関係をインストールします...
Creating virtualenv fastapi-poetry-xS3fZVNL-py3.12 in /root/.cache/pypoetry/virtualenvs
Using version ^0.115.4 for fastapi
Using version ^0.32.0 for uvicorn
Using version ^1.27.0 for beanie
Using version ^2.32.3 for requests
Updating dependencies
Resolving 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 file
requirements.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が作成されている

pyproject.toml

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での管理から移行する際は便利だと思う。

新着記事

top