2
1

【Python】VSCodeからDocker上のFastAPIをデバッグできるようにする

Last updated at Posted at 2024-05-23

はじめに

VSCodeを使って、FastAPIのデバッグができる方法を調査しました。
本記事では、デバッグ環境構築の方法をご紹介します。

動作イメージ

下記のGifのようにVSCodeのブレークポイントでコードを止めることができます。また、ホバーした変数の値を参照したり、書き換えることができます。

debugpy_mp動作の様子.gif

debugpy_マウスホバー.png

環境設定の概要

環境構築手順の要点は下記の通りです。

  1. 対象となるFastAPIプロジェクトのrequirements.txtにdebugpyを追加する
  2. debugpyを起動できるように、docker-compose.ymlを設定する
  3. VSCodeからアクセスできるように、launch.jsonを作成する

フォルダ構造

今回のサンプルのディレクトリ構造は下記のとおりです。

 (VSCodeプロジェクトルート)
  ├ docker-compose.yml
  ├ backend
    ├ app
      ├ Dockerfile
      ├ requirements.txt
      ├ main.py # FastAPI実行ファイル

環境設定の手順

1. requirements.txt に debugpy を追加する

requirements.txt
fastapi
debugpy # 追加

2. debugpyを起動できるように、docker-compose.ymlを設定する

docker-compose.yml
  backend:
    build:
      context: ./backend
      dockerfile: ./Dockerfile
    volumes:
      - ./backend/:/backend
    env_file: ./backend/.env
    working_dir: /backend/app
    command: sh -c "python3 -m debugpy --listen 0.0.0.0:5678 -m uvicorn main:app --reload --proxy-headers --host='0.0.0.0' --port=8000"
    ports:
      - "8000:8000"
      - "5678:5678"
    tty: true
    stdin_open: true

下記のdiffは、通常のdocker-compose.ymlとの差分を表したものです。通常の設定と異なる箇所は、command, portsの指定です。

    env_file: ./backend/.env
    working_dir: /backend/app
-    command: sh -c "uvicorn main:app --reload --proxy-headers --host='0.0.0.0' --port=8000"
+    command: sh -c "python3 -m debugpy --listen 0.0.0.0:5678 -m uvicorn main:app --reload--proxy-headers --host='0.0.0.0' --port=8000"
    ports:
-      - "8080:8000"
+      - "8000:8000"
+      - "5678:5678" # debugpy用のポートを追加
    tty: true
  • command: python3 -m debugpy --listen 0.0.0.0:5678 -m を先頭につけます
  • ports: 5678ポートをフォワーディングします

3. VSCodeからアクセスできるように、launch.jsonを作成する

launch.json は、プロジェクト内の.vscode/ディレクトリ配下に作成します。

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "debugpy",
            "request": "attach",
            "name": "Docker (FastAPI)",
            "connect": {
                "host": "localhost",
                "port": 5678  // docker-compose.ymlの ports の定義と同じにします
            },
            // docker-compose.ymlの volumes で定義した構造と同じにするよう設定します
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}/backend",
                    "remoteRoot": "/backend"
                }
            ]
        }
    ]
}

上記のlaunch.jsonファイルの中で要点は下記のとおりです。

  • host
    • localhostとします
  • port
    • ポートフォワーディングしたdebugpyのport番号を指定します
  • pathMapping
    • localRoot: ホスト側の起点ディレクトリです。サンプルコードでは、プロジェクト内の/backendディレクトリを指定しています。
    • remoteRoot: コンテナ内の起点ディレクトリです。サンプルコードでは、/backendディレクトリを指定しています。
      これらの設定は、docker-compose.ymlのvolume指定を参考に記述すると良いです。
  • 補足

使ってみる

ここまでの手順で、VSCodeからdebugpyを利用する準備は終了です。動作確認には以下の手順を実行してください。

  1. docker-compose up を実行し、FastAPIコンテナを起動する
  2. VSCodeを開き、適当な行番号をマークする(赤印をつける)
  3. VSCodeサイドメニューの実行とデバッグをクリックし、上部の▷ Docker (FastAPI)をクリックする
  4. OpenAPIなどからFastAPIにリクエストを飛ばし、指定した行で処理が止まることを確認する

debugpy_説明.png

Happy Hacking!

ローカルファイルの変更がDockerコンテナ内に反映されないときは?(mac環境など)

docker-compose.ymlに下記の環境変数を追加すると、FastAPIが強制リロードしてくれます。
※ ただし反映まで3秒程度のラグが生じるようです。

    environment:
      - WATCHFILES_FORCE_POLLING=true

参考記事

2
1
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
2
1