在容器内调试Python
当向Python项目添加Docker文件时,会添加任务和启动配置以启用Docker容器内的应用程序调试。为了适应Python项目的各种场景,某些应用可能需要额外的配置。
配置Docker容器入口点
你可以通过在tasks.json
中设置属性来配置Docker容器的入口点。当你第一次使用Docker: 添加Docker文件到工作区...命令时,VS Code会自动配置容器的入口点。
示例:配置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日志。
- 应用程序必须记录一条“服务器准备就绪”的消息。
- 应用程序必须提供一个可浏览的页面。
这是一个使用 dockerServerReadyAction
根据特定服务器消息模式启动浏览器打开 about.html
页面的示例:
{
"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
属性设置为包含两个字符串标记的格式字符串,以指示协议和端口替换。
如何在Django或Flask应用中启用热重载
当你为Django或Flask选择Docker: 添加Docker文件到工作区时,我们会为你提供一个配置用于静态部署的Dockerfile和tasks.json
。每次你对应用代码进行更改时,都需要重新构建并重新运行你的容器。热重载允许你在容器继续运行的同时,可视化应用代码中的更改。按照以下步骤启用热重载:
适用于Django应用
-
在Dockerfile中,注释掉将应用程序代码添加到容器的那一行。
#ADD . /app
-
在
tasks.json
文件中的docker-run
任务内,创建一个新的dockerRun
属性,并添加一个volumes
属性。此设置将从当前工作区文件夹(应用程序代码)映射到容器中的/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: The docker build context, from which your Dockerfile is called
- dockerfile: The path to the Dockerfile to execute
- tag: The name of the image to be built, with its version 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" } } ] }
-
下一步
了解更多关于: