FastAPIの開発環境をDockerで構築する

デバッグできるところまで。
概ね公式ドキュメント通りでOK
https://fastapi.tiangolo.com/ja/deployment/docker/



プロジェクト構成


以降はVisual Studio Codeを前提として話を進める。
ProjectDirectory
  ├─ .vscode
  │   ├─ launch.json
  ├─ app
  │   ├─ main.py
  ├─ debug-docker-compose.yml
  ├─ docker-compose.yml
  ├─ Dockerfile
  ├─ requirements.txt

少し重くなるため、開発用と+デバッグ実行用途で分けている。



app/main.py


from typing import Union
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    test = 1
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
app以下のファイルはコンテナにマウントされる(後ほど設定する)


Dockerfile


FROM python:3.13-rc-slim as builder
# FROM python:3

# Python FastAPI用Dockerfile
# 以下はdocker-composeで設定
## コンテナとホスト間でポートのマッピング
## ホストの./appディレクトリをコンテナ上の/code/appへマウント

WORKDIR /code

RUN apt-get update
# ロケール設定、タイムゾーン変更
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9

# コンテナ内での編集用
RUN apt-get install -y vim less

# 依存関係インストール
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# RUN pip install fastapi
# RUN pip install pydantic
# RUN pip install "uvicorn[standard]"

# COPY ./app /code/app



元となるイメージは以下から対応しているバージョンの一番新しいものを選択する。
https://hub.docker.com/_/python
slimだとサイズが小さくなる(必要なものが含まれていない可能性もある)

app以下のソースファイルは後ほどマウントするため公式の手順と違ってコピーしない。
また起動コマンドはdocker-composeで記述するためDockerfileには記述しない。


requirements.txt


依存関係を記述してビルド時にインストールするように。

fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0
debugpy

docker-compose.yml


version: '3'
services:
  python3:
    ports:
      - 80:80
    restart: always
    build:
      context: .
      target: dev
    container_name: 'python3'
    # tty: true
    volumes:
      - ./app:/code/app
    command:
        [
            "uvicorn",
            "app.main:app",
            "--reload",
            "--host", "0.0.0.0",
            "--port", "80"
        ]


以上で起動して確認可能。

docker-compose up
docker-compose -f docker-compose.yml up -d
docker-compose -f docker-compose.yml up -d --build
-f ファイル名:設定ファイルを指定。デフォルトはdocker-compose.yml
-d:バックグラウンドで起動する
--build:再ビルドをおこなう。Dockerfileを変更したときなど。

docker-compose upコマンド実行後に以下のいずれかへアクセス(どれもおおよそ同じ意味)
http://localhost/
http://0.0.0.0/
http://127.0.0.1

また
http://127.0.0.1/docs
で作成したAPIのドキュメント確認すことが可能(FastAPIの機能)



デバッグをおこなう


debug-docker-compose.yml

version: '3'
services:
  python3:
    ports:
      - 80:80
      - "5678:5678"
    restart: always
    build: .
    container_name: 'python3'
    # tty: true
    volumes:
      - ./app:/code/app
    command:
        [
          "python3",
          
          "-m", "debugpy",
          "--listen", "0.0.0.0:5678",
          
          "-m",
          "uvicorn",
          "app.main:app",
          "--reload",
          "--host", "0.0.0.0",
          "--port", "80"
        ]

通常のdocker-composeファイルとの違いはportと起動コマンドのみ。

launch.json


Visual Studio CodeのRUN AND DEBUGから
create a launch.json
→ Python Debugger
→ Remote Attach
→ localhost
→ 5678


以下のファイルが作成される。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python Debugger: Remote Attach",
            "type": "debugpy",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ]
        }
    ]
}


ブレークポイントを貼った状態でF5でデバッグ実行をおこなうと、該当の処理を実行するときに一時停止して変数等を確認できるようになる。


参考




https://fastapi.tiangolo.com/ja/deployment/docker/
https://qiita.com/yagrush/items/e46ab11b22495cd2c0a0

2024年4月21日日曜日