コンテナー内で Python をデバッグする
Docker ファイルを Python プロジェクトに追加すると、Docker コンテナー内でアプリケーションをデバッグできるようにタスクと起動構成が追加されます。Python プロジェクトのさまざまなシナリオに対応するために、一部のアプリでは追加の構成が必要になる場合があります。
Docker コンテナーのエントリ ポイントの構成
tasks.json
のプロパティを設定することで、Docker コンテナーのエントリ ポイントを構成できます。VS Code は、最初に [**Docker: Docker ファイルをワークスペースに追加...**] コマンドを使用するときに、コンテナーのエントリ ポイントを自動的に構成します。
例: Python モジュールのエントリ ポイントの構成
{
"tasks": [
{
"type": "docker-run",
"label": "docker-run: debug",
"dependsOn": ["docker-build"],
"python": {
"module": "myapp"
}
}
]
}
例: Python ファイルのエントリ ポイントの構成
{
"tasks": [
{
"type": "docker-run",
"label": "docker-run: debug",
"dependsOn": ["docker-build"],
"python": {
"args": ["runserver", "0.0.0.0:8000", "--nothreading", "--noreload"],
"file": "manage.py"
}
}
]
}
アプリケーションのエントリ ページへのブラウザーの自動起動
[**Docker: Python - Django**] または [**Docker: Python - Flask**] の起動構成を選択すると、アプリのメイン ページにブラウザーが自動的に起動されます。この機能は既定で有効になっていますが、launch.json
で dockerServerReadyAction
オブジェクトを設定することで、この動作を明示的に構成できます。
この機能は、アプリケーションのいくつかの側面に依存しています
- アプリケーションは、**デバッグ コンソールまたは Docker ログに出力する必要があります**。
- アプリケーションは、「サーバーの準備完了」メッセージをログに記録する必要があります。
- アプリケーションは、参照可能なページを提供する必要があります。
サーバー メッセージの特定のパターンに基づいて about.html
ページを開くためにブラウザーを起動する dockerServerReadyAction
の使用例を次に示します
{
"configurations": [
{
"name": "Docker: Python - Django",
"type": "docker",
"request": "launch",
"preLaunchTask": "docker-run: debug",
"python": {
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/app"
}
],
"projectType": "django"
},
"dockerServerReadyAction": {
"action": "openExternally",
"pattern": "Starting development server at (https?://\\S+|[0-9]+)",
"uriFormat": "%s://localhost:%s/about.html"
}
}
]
}
注:
pattern
属性にある正規表現は、単に「http://localhost:8000
で開発サーバーを起動しています」のようなログ メッセージをキャプチャしようとするものです。http または https、任意のホスト名、および任意のポートの URL のバリエーションに対応しています。
dockerServerReadyAction オブジェクトの重要なプロパティ
-
action
: パターンが見つかったときに実行するアクション。debugWithChrome
またはopenExternally
を指定できます。 -
pattern
: アプリケーションが上記とは異なるメッセージをログに記録する場合は、dockerServerReadyAction オブジェクトのpattern
プロパティを、そのメッセージに一致する JavaScript 正規表現 に設定します。正規表現には、アプリケーションがリッスンしているポートに対応するキャプチャ グループを含める必要があります。 -
uriFormat
: 既定では、Docker 拡張機能はブラウザーのメイン ページを開きます (ただし、アプリケーションによって決定されます)。上記の例のように、ブラウザーで特定のページを開く場合は、dockerServerReadyAction オブジェクトのuriFormat
プロパティを、プロトコルとポートの置換を示す 2 つの文字列トークンを含む書式文字列に設定する必要があります。
Django または Flask アプリでホットリロードを有効にする方法
Django または Flask 用に [**Docker: Docker ファイルをワークスペースに追加**] を選択すると、静的デプロイ用に構成された Dockerfile と tasks.json
が提供されます。アプリ コードを変更するたびに、コンテナーをリビルドして再実行する必要があります。ホットリロードを使用すると、コンテナーの実行中にアプリ コードの変更を視覚化できます。次の手順でホットリロードを有効にします
Django アプリの場合
-
Dockerfile で、アプリ コードをコンテナーに追加する行をコメントアウトします。
#ADD . /app
-
tasks.json
ファイルのdocker-run
タスク内で、volumes
プロパティを持つ新しいdockerRun
属性を作成します。この設定により、現在のワークスペース フォルダー (アプリ コード) からコンテナー内の/app
フォルダーへのマッピングが作成されます。{ "type": "docker-run", "label": "docker-run: debug", "dependsOn": [ "docker-build" ], "dockerRun": { "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, ... }
-
--noreload
と--nothreading
を削除して、python 属性を編集します。{ ... "dockerRun": { "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, "python": { "args": [ "runserver", "0.0.0.0:8000", ], "file": "manage.py" } }
-
[**Docker: Python – Django**] 起動構成を選択し、F5 を押して、コンテナーをビルドして実行します。
-
任意のファイルを変更して保存します。
-
ブラウザーを更新し、変更が加えられたことを確認します。
Flask アプリの場合
-
Dockerfile で、アプリ コードをコンテナーに追加する行をコメントアウトします。
#ADD . /app
-
tasks.json
ファイルのdocker-run
タスク内で、env
プロパティにFLASK_ENV
とvolumes
プロパティを追加して、既存の dockerRun 属性を編集します。この設定により、現在のワークスペース フォルダー (アプリ コード) からコンテナー内の/app
フォルダーへのマッピングが作成されます。{ "type": "docker-run", "label": "docker-run: debug", "dependsOn": [ "docker-build" ], "dockerRun": { "env": { "FLASK_APP": "path_to/flask_entry_point.py", "FLASK_ENV": "development" }, "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, ... }
-
--no-reload
と--no-debugger
を削除して、python 属性を編集します。{ ... "dockerRun": { "env": { "FLASK_APP": "path_to/flask_entry_point.py", "FLASK_ENV": "development" }, "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, "python": { "args": [ "run", "--host", "0.0.0.0", "--port", "5000" ], "module": "flask" } }
-
[**Docker: Python – Flask**] 起動構成を選択し、F5 を押して、コンテナーをビルドして実行します。
-
任意のファイルを変更して保存します。
-
ブラウザーを更新し、変更が加えられたことを確認します。
コンテナーを一緒にビルドおよび実行する方法
- 前述の
tasks.json
ファイルには、docker-build
タスクへの依存関係があります。このタスクは、tasks.json
のtasks
配列の一部です。例:
"tasks":
[
{
...
},
{
"label": "docker-build",
"type": "docker-build",
"dockerBuild": {
"context": "${workspaceFolder}",
"dockerfile": "${workspaceFolder}/Dockerfile",
"tag": "YOUR_IMAGE_NAME:YOUR_IMAGE_TAG"
}
}
]
ヒント: 依存関係が docker-build
を依存関係として明確に示しているため、名前はこのタスクと一致する必要があります。必要に応じて、名前を変更できます。
-
JSON の
dockerBuild
オブジェクトでは、次のパラメーターを使用できます- context: Dockerfile が呼び出される Docker ビルド コンテキスト
- dockerfile: 実行する Dockerfile へのパス
- tag: ビルドするイメージの名前 (バージョン タグ付き)
-
全体として、Flask アプリケーションをビルドおよびデバッグするための VS Code のセットアップは次のようになります
-
launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Debug Flask App", "type": "docker", "request": "launch", "preLaunchTask": "docker-run: debug", "python": { "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } ], "projectType": "flask" }, "dockerServerReadyAction": { "action": "openExternally", "pattern": "Running on (http?://\\S+|[0-9]+)", "uriFormat": "%s://localhost:%s/" } } ] }
-
tasks.json
{ "version": "2.0.0", "tasks": [ { "type": "docker-run", "label": "docker-run: debug", "dependsOn": ["docker-build"], "dockerRun": { "containerName": "YOUR_IMAGE_NAME", "image": "YOUR_IMAGE_NAME:YOUR_IMAGE_TAG", "env": { "FLASK_APP": "path_to/flask_entry_point.py", "FLASK_ENV": "development" }, "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ], "ports": [ { "containerPort": 5000, "hostPort": 5000 } ] }, "python": { "args": ["run", "--host", "0.0.0.0", "--port", "5000"], "module": "flask" } }, { "label": "docker-build", "type": "docker-build", "dockerBuild": { "context": "${workspaceFolder}", "dockerfile": "${workspaceFolder}/Dockerfile", "tag": "YOUR_IMAGE_NAME:YOUR_IMAGE_TAG" } } ] }
-
次のステップ
詳細情報