これをするとどんな良いことが?
デバッグが捗る。
ソースコードにブレークポイントを設定して、
APIを実行してみると、
普通にブラウザで開くでもおk
処理が一時停止してVSCodeのデバッグビューがアクティブになる
その瞬間の変数の中身が見れたり、次のブレークポイントまで進んだり、一行ずつ進んだりしながらじっくり観察できる
その時だけ変数を勝手に書き換えて処理を続行させたりもできる
デメリット
動作が重くなる。
なので、デバッグの必要がない場合(サービス本稼働など)は、この手順を含まない方法で起動した方が良い。
試した環境
開発環境(端末)
- Macbook Air (M1)
- VSCode November 2021 (version 1.63)
- Python 3.9.9 (homebrewでインストールした)
FastAPIサーバ(Docker)
- Docker Desktop for Mac 4.2.0
- Docker version 20.10.12
- docker-compose version 1.29.2
コンテナ
- python:3.11-rc linux/x86-64
pipでインストールしたライブラリ
Package | Version |
---|---|
anyio | 3.5.0 |
asgiref | 3.4.1 |
click | 8.0.3 |
fastapi | 0.71.0 |
h11 | 0.12.0 |
idna | 3.3 |
pip | 21.2.4 |
pydantic | 1.9.0 |
python-multipart | 0.0.5 |
setuptools | 57.5.0 |
six | 1.16.0 |
sniffio | 1.2.0 |
starlette | 0.17.1 |
typing_extensions | 4.0.1 |
uvicorn | 0.16.0 |
wheel | 0.37.0 |
VSCodeのプロジェクト構成(必要な各種設定ファイル)
.vscode/
launch.json
settings.json
src/
...
debug-docker-compose.yml
debug.Dockerfile
debug.Dockerfile
debug と頭についているのは、通常稼働用と区別するため。
FROM --platform=linux/x86-64 python:3.11-rc
RUN apt update -y
RUN apt-get install build-essential
RUN pip install fastapi uvicorn python-multipart
RUN pip install debugpy
COPY src /src
WORKDIR /src
EXPOSE 8000
CMD ["python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "-m", "uvicorn", "prog:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]
debug-docker-compose.yml
debug と頭についているのは、通常稼働用と区別するため。
version: '3.7'
services:
server:
container_name: myfastapi
build:
context: .
dockerfile: ./debug.Dockerfile
restart: always
volumes:
- ./src:/src
expose:
- "8000"
- "5678"
ports:
- 8000:8000
- 5678:5678
launch.json
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "python",
"request": "attach",
"name": "FastAPI Remote Debug",
"port": 5678,
"host": "localhost",
"pathMappings": [
{
"localRoot": "${workspaceFolder}/src",
"remoteRoot": "/src"
}
]
}
]
}
settings.json
{
"python.pythonPath": "/opt/homebrew/bin/python3",
"files.watcherExclude": {
"**/homebrew/**": true
}
}
手順
FastAPIコンテナのビルド設定
必要なファイルは、前項の VSCodeのプロジェクト構成(必要な各種設定ファイル) の通りです。
ここでは、それらの内容のうち、要点をピックアップして説明します。
[debug.Dockerfile] debugpyインストールを含めておく
RUN pip install debugpy
[debug.Dockerfile] APIサーバの起動コマンドにdebugpyの待ち受けを入れ込む
通常はこんな感じだと思うが、
CMD ["uvicorn", "prog:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]
↓こう変える。
CMD ["python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "-m", "uvicorn", "prog:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]
[debug-docker-compose.yml] debugpyの待ち受けポートをコンテナの外に解放するよう設定する
expose:
- "5678"
ports:
- 5678:5678
VSCodeの設定
[launch.json] debugpyに接続する構成を登録しておく
{
"type": "python",
"request": "attach",
"name": "FastAPI Remote Debug",
"port": 5678,
"host": "localhost",
"pathMappings": [
{
"localRoot": "${workspaceFolder}/src",
"remoteRoot": "/src"
}
]
}
FastAPIコンテナを起動する
docker-compose -f debug-docker-compose.yml up --build
VSCodeからdebugpyに接続する
launch.jsonに登録した「FastAPI Remote Debug」構成を実行する
繋がると↓こうなる
ソースコードにブレークポイントを設定してみる
APIを実行してみる
普通にブラウザで開くでもおk
処理が一時停止してVSCodeのデバッグビューがアクティブになる
その瞬間の変数の中身が見れたり、次のブレークポイントまで進んだり、一行ずつ進んだりしながらじっくり観察できる
その時だけ変数を勝手に書き換えて処理を続行させたりもできる