
Docker上にアプリケーションを構築するのが一般的になってきた昨今、Dockerコンテナへのリモートデバッグはバグ解析には必須です。今回は、Visual Studio CodeでPythonのFlaskで作成したRES APIアプリケーションをリモートデバッグする方法を紹介します。
見出し
はじめに
FlaskはPythonでサーバーサイドアプリケーションを作る人気のフレームワークです。Visual Studio CodeはもとはJavaScript向けのエディタでしたが、今ではPythonの開発環境としても人気のエディタです。
リモートデバッグとは、リモート(ローカル以外)で稼働しているアプリケーションに対して、ローカルから接続して、デバッグすることです。Docker上にあるアプリケーションをデバッグするには、リモートデバッグで行う必要があります。
今回は、Docker上でFlaskで作ったREST APIアプリケーションを構築し、そのアプリケーションへVisual Studio Codeからリモートデバッグしていきましょう。
前提
以下の準備が整っている必要があります。
- Dockerがインストールされている
- Visual Studio Codeがインストールされている(Python用の基本設定は以前の記事を参照してください)
- Python3がインストールされている
細かいバージョンは「環境」を参照してください。
Docker上に簡単なFlaskのREST APIアプリケーションを作る
ベースを作る
まずはデバッグする対象となるRESTアプリケーションを簡単に作成しましょう。FlaskでRESTなAPIを作ります。
$ mkdir flask-vscodea-app
$ cd flask-vscodea-app/
$ touch app.py
$ touch requirements.txt
$ touch Dockerfile
$ touch docker-compose.yml
Dockerの設定ファイルを作る
今回のアプリケーションはFlakeのアプリケーションからMongoDBを使う構成にします。
Dockerfile
以下のようにします。
FROM python:3-slim-stretch
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --upgrade pip setuptools \
&& pip install --no-cache-dir -r requirements.txt
ENV PYTHONUNBUFFERED 1
ENV FLASK_APP app.py
COPY ./ ./
EXPOSE 5000
CMD python app.py
注意点としては、PythonのイメージとしてAlpineを選択するとビルドできないパッケージがあるという点です。Dockerに慣れているとAlpineを選択しがちですが、PythonではSlimを選択するのがベターです。
また、DockerでPython環境を構築する場合は、venvで仮想環境を構築する必要はなく、単にグローバルにパッケージをインストールして使います。
docker-compose.yml
FlakeのアプリケーションからMongoDBを使う構成になるように以下のように書きます。
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
- "5000:5000"
environment:
- FLASK_ENV=development
- REMOTE_DEBUGGING=False
volumes:
- .:/usr/src/app
links:
- db
db:
image: mongo
ports:
- "27017:27017"
外部ポートは、Flaskアプリケーション用に5000ポート、リモートデバッグ用に3000ポートを開けてあります。
Flaskアプリケーションを作る
簡単なREST APIを作ります。
requirements.txt
インストールするパッケージのリストを書きます。
ptvsd
Flask
flask_restful
pymongo
app.py
Flaskのアプリケーションを書きます。
今回は環境変数として「REMOTE_DEBUGGING」のフラグを持たせることで、REMOTE_DEBUGGINGがTrueの場合にリモートデバッグができるようにしています。
注意点としては、リモートデバッグする時は、Flask実行時に「––no-debugger」(debug=False)と「––no-reload」(use_reloader=False)のオプションを有効にする必要があります。詳しくは公式ドキュメントを参照してください。
動作確認
それでは、APIの動作確認を簡単にしましょう。
OKですね。
Visual Studio Codeでリモートデバッグする
次に、Dockerへのリモートデバッグをやってみましょう。
ローカルにptvsdをインストールする
Visual Studio Codeでリモートデバッグする場合は、PTVSDをローカルとDockerコンテナの両方にインストールする必要があります。
Visual Studio Codeのデバッグ設定ファイルを作る
Visutal Studio Codeを開き、デバッグボタンから「構成の追加」をクリックします。
「Python」を選択します。
すると、ローカルに「.vscode/launch.json」のファイルが作成されます。
launch.json
「.vscode/launch.json」にリモートデバッグ用の設定を以下のように追加します。
リモートデバッグ用のポートを3000に設定しています。今回のDockerの設定ですでに3000ポートは開けてありますね。
動作確認
それではリモートデバッグの動作確認をしていきましょう。
まずは、REMOTE_DEBUGGINGを有効にして、Dockerを起動します。
するとデータベースだけ起動して、以下のように接続待ち状態になります。
Visual Studio Codeからデバッグで接続します。
リモートデバッグの接続が完了するとFlaskアプリケーションが以下のように起動します。
これでリモートデバッグの準備は完了しました。
次に、POSTしたデータを取得している箇所でブレークポイントを設定しています。
コマンドラインからPOSTしてみます。
受信したデータがデバッグ画面に表示されています。
これでリモートデバッグが動いていることが確認できました。
最後に
いかがでしたか?これでDockerコンテナ上にPythonでアプリケーションを構築した場合に、Visutal Studio Codeからデバッグできるようになりましたね。それでは。
環境
- Visutal Studio Code: 1.28.2
- Docker: Docker version 18.06.1-ce, build e68fc7a
- Python: 3.7.1
- pip: 18.1
- ptvsd: 4.1.4


コメントを残す