Edited at

Docker上で動くgunicorn + DjangoアプリケーションをVS Codeからリモートデバッグする


はじめに

Pythonを使ったWeb開発を始めるにあたり、まずは快適なデバッグ環境を整えようと考えました。Web上では、Docker gunicorn+Django VSCodeのすべての要素をカバーした情報がうまく見つからなかったので、備忘録として残します。


構成の概要


クライアント側

VS Codeに、Python extension for VS Codeをインストールして、ポート3000番経由で、サーバー側で起動しているデバッグサーバーにアクセスします。


サーバー側

ptvsd (Python Tools for Visual Studio debug server)を gunicorn から呼び出し、デバッグサーバーを立ち上げます。デバッグサーバーはポート3000番でクライアントの接続を待ち受けます。


各種バージョン


  • Mac OS 10.14.6

  • Visual Studio Code 1.37

  • Docker 19.03.2

  • Python 3.7.4

  • gunicorn 19.9.0

  • Django 1.11.8

  • ptvsd 4.3.2


デバッグの準備


1.クライアント側準備


1-1.Python extention for Visual Studio Codeのインストール

VS Codeのメニューから、該当の拡張機能をインストールします。


1-2.VS Codeにデバッグ設定を追加する

左側のメニューからデバッグアイコン(虫の形)を選択し、上部のメニューより「設定の追加」⇨「Python」⇨「Remote Attach」を選択します。

開いたlaunch.jsonに以下のように編集します。

{

"version": "0.2.0",
"configurations": [
{
"name": "Remote Django Remote Debug",
"type": "python",
"request": "attach",
"port": 3000,
"host": "localhost",
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
}
]
},
]
}


2.サーバー側準備


2-1.ptvsdのインストール

ptvsd 4.3.2 を requirements.txtに加えます。昔は3.0.0に固定しないとリモートデバッグが動かないバグがあったが、最新版では解消しているようです。


2-2.Docker環境で3000番ポートを解放する

docker-compose.yml に以下の設定を加えます。

ports:

- "3000:3000"


2-3.gunicorn から ptvsd を起動する

Django のエントリポイント(最初に呼び出される処理)に ptvsd を呼び出すコードを追記します。ここでは、ローカルホストで先ほど解放したポート番号3000番で接続を受け付けます。

import ptvsd

ptvsd.enable_attach(address=('0.0.0.0', 3000))

エントリポイントごとのファイルは以下の通りです。

- 管理コマンドから起動する場合: manage.py

- gunicorn から mysite:wsgi と呼び出す場合: mysite/wsgi.py


2-4.gunicornのタイムアウトを伸ばす

デバッグ中にブレークポイントで停止させていると、gunicorn がタイムアウトします。こちらに記載がある通り、以下の引数で gunicorn のプロセスのタイムアウトを変更できます。

gunicorn "mysite.wsgi" --timeout 1000000

また、環境変数として.evn.docker-composeファイルに記述すると、docker-compose.ymlの修正せずにTIMEOUTを変更できます。

GUNICORN_CMD_ARGS="--timeout=1000000"


3. デバッグ


3-1.アプリケーションの起動

docker-compose up等のコマンドで、デバッグ対象のアプリケーションを起動します。gunicorn 起動時に ptvsd が呼び出されて、ポート3000番でクライアントの接続を待ち受けます。


3-2.ブレイクポイントの設定

デバッガーで確認したいソースコードの行の左をクリックし、ブレークポイント(赤丸)を設定します。


3-3.デバッガのアタッチ

左側のメニューからデバッグアイコン(虫の形)を選択します。上部のドロップダウンメニューから「Remote Django Remote Debug」を選択し、デバッグを開始します。


3-4.アプリケーションへのアクセス

ローカル環境で起動したアプリケーションにアクセスします。うまくデバッガーに接続できていれば、ブレークポイントに到達した段階で、アプリケーションの処理が一時停止し、デバッグが可能となります。

快適なデバッグライフを!


参考文献