15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python: VSCodeからDocker内で動いているFastAPIにステップ実行デバッグを仕掛ける

Last updated at Posted at 2022-01-14

これをするとどんな良いことが?

デバッグが捗る。

ソースコードにブレークポイントを設定して、

スクリーンショット 2022-01-14 13.13.55.png

APIを実行してみると、

普通にブラウザで開くでもおk

スクリーンショット 2022-01-14 13.17.31.png

処理が一時停止してVSCodeのデバッグビューがアクティブになる

その瞬間の変数の中身が見れたり、次のブレークポイントまで進んだり、一行ずつ進んだりしながらじっくり観察できる

スクリーンショット 2022-01-14 13.22.32.png

その時だけ変数を勝手に書き換えて処理を続行させたりもできる

スクリーンショット 2022-01-14 13.30.19.png

スクリーンショット 2022-01-14 13.32.07.png

スクリーンショット 2022-01-14 13.33.27.png

デメリット

動作が重くなる。
なので、デバッグの必要がない場合(サービス本稼働など)は、この手順を含まない方法で起動した方が良い。

試した環境

開発環境(端末)

  • 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」構成を実行する

スクリーンショット 2022-01-14 13.06.02.png

繋がると↓こうなる

スクリーンショット 2022-01-14 13.10.51.png

ソースコードにブレークポイントを設定してみる

スクリーンショット 2022-01-14 13.13.55.png

APIを実行してみる

普通にブラウザで開くでもおk

スクリーンショット 2022-01-14 13.17.31.png

処理が一時停止してVSCodeのデバッグビューがアクティブになる

その瞬間の変数の中身が見れたり、次のブレークポイントまで進んだり、一行ずつ進んだりしながらじっくり観察できる

スクリーンショット 2022-01-14 13.22.32.png

その時だけ変数を勝手に書き換えて処理を続行させたりもできる

スクリーンショット 2022-01-14 13.30.19.png

スクリーンショット 2022-01-14 13.32.07.png

スクリーンショット 2022-01-14 13.33.27.png

15
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?