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

【Docker × Flask】コンテナでFlaskAPI(gunicorn)をデバッグする

作成日:2024月02月24日
更新日:2024年03月09日

dockerコンテナ作成し、コンテナ内でgunicornで動作させている
flask製のAPIをVScodeでデバッグする方法をまとめる。

コンテナ内でgunicornで動作させている
flask製のAPIについては下記記事で作ったものを使う

拡張機能インストール

まずは拡張機能の「Python」と「Python Debugger」をインストールする。
※ないとlaunch.jsonのfastAPIの構成がでてこないので。 2023-08-24-02-01-41

2024-03-09-19-56-41

VSCodeの設定

VScodeではデバッグする際はデバッグ設定用のファイルである

  • launch.json

を作る必要がある。

launch.json作成

flask製のAPIを動かすためのlaunch.jsonを作っていく

launch.jsonファイルを作成しますをクリックする

2023-08-24-02-03-51

Pythonを選択

2023-08-24-02-04-37 拡張機能の「Python」をインストールしていないと
でてこない。

Flaskを選択

2024-02-24-21-44-09

アプリケーションへのパスを入力

flaskアプリケーションへのパスを入力する。
このapiの場合はプロジェクト構成が下記のようになっている

bash
.
|-- Dockerfile
|-- app
| |-- api.py
| `-- wsgi.py
|-- docker-compose.yml
|-- gunicorn_config.py
`-- requirements.txt

ので
2024-02-24-21-45-30 と入力する
※後で変えれるので、この時点でわからなければ適当でもいい。

launch.jsonファイルが生成される

自動でlaunch.jsonファイルが生成される

launch.json
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python デバッガー: Flask",
"type": "debugpy",
"request": "launch",
"module": "flask",
"env": {
"FLASK_APP": "app.api.py",
"FLASK_DEBUG": "1"
},
"args": [
"run",
"--no-debugger",
"--no-reload"
],
"jinja": true
}
]
}

このlaunch.jsonだとflaskの内部サーバーが動くので
編集する必要がある

launch.jsonの編集

上記で作成したlaunch.jsonをgunicornで動いているAPIを
デバッグできるように修正する

launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Python デバッガー: Flask with Gunicorn",
"type": "debugpy",
"request": "launch",
"module": "gunicorn",
"args": [
"--reload",
"-w",
"1",
"--bind",
"0.0.0.0:5001",
"--chdir",
"/workspace/app",
"wsgi:flask_api"
],
"jinja": true
}
]
}
  • moduleに実行するサーバーである「gunicorn」を設定
  • argsにGunicornのコマンドライン引数が追加する

下記のコマンドをデバッガーで実行しているイメージ

bash
$ gunicorn --reload -w 1 --bind 0.0.0.0:5001 --chdir /workspace/app wsgi:flask_api

注意

このアプリで下記のdocker-compose.ymlで作成したコンテナで
動いてる

docker-compose.yml
version: "3"
services:
flaskapi:
container_name: "flask-api"
build:
context: .
dockerfile: Dockerfile
ports:
- "5000:5000"
volumes:
# バインドマウント
- .:/workspace
# サーバー(gunicorn)実行
command: gunicorn wsgi:flask_api --config gunicorn_config.py
# command: gunicorn --reload -w 1 --bind 0.0.0.0:5000 --chdir /workspace/app wsgi:flask_api
tty: true

コンテナ内では、port:5000でgunicornサーバーが起動しているため
デバッグではport:5001で動かしている。

もしデバッグ側でもport:5000を使いたい場合はport:5000で起動している
gunicornサーバーを止める必要がある。

port:5000で起動しているgunicornサーバーを止めた場合は
下記のようにgunicorn_config.pyを読み込ませる形でもデバッグできる。

launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Python デバッガー: Flask",
"type": "debugpy",
"request": "launch",
"module": "gunicorn",
"args": [
"wsgi:flask_api",
"--config",
"gunicorn_config.py"
],
"jinja": true
}
]
}

要は通常起動させているportがデバッグしているportと同時に使用しないように
しておくけば問題はない。

まぁ、デバッグの設定なので個人的にはわざわざ「gunicorn_config.py」を
読み込ませる必要はないと思う。

デバッグしてみる

launch.jsonができたので、実際にデバッグを
実行してみる

launch.jsonは下記の方を使う

launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Python デバッガー: Flask with Gunicorn",
"type": "debugpy",
"request": "launch",
"module": "gunicorn",
"args": [
"--reload",
"-w",
"1",
"--bind",
"0.0.0.0:5001",
"--chdir",
"/workspace/app",
"wsgi:flask_api"
],
"jinja": true
}
]
}

ブレークポイントを打つ

任意の場所にブレークポイントをつける 2024-02-25-01-00-21

デバッグを実行

作成したデバッガーでデバッグを実行する 2024-02-25-01-01-27

ブラウザからアクセスする

ホストのブラウザから「http://localhost:5001」にアクセスすると 2024-02-25-01-03-29

ブレークポイントで止めるのが確認できる

まとめ

コンテナ内のgunicornサーバー上で起動するflaskのapiを
デバッグする方法をまとめてみた。

下記記事で合わせてみれば
flaskのapiの環境設定とデバッグ設定についての流れは
理解できると思う。

参考書籍

新着記事

タグ別一覧
top