在 VS Code 中连接远程服务器并调试 Docker 容器内的 Python 项目,主要有两种主流且高效的方式。
看到你已经成功运行了名为 ncsb-debug 的容器,并且映射了 8000 端口。你可以根据实际需求选择以下两种方法:
方法一:使用 Dev Containers 插件直接"进入"容器(⭐ 最推荐,体验等同本地开发)
这是目前 VS Code 官方最推荐的做法。它允许你直接把 VS Code 的后端运行在 Docker 容器内部,你可以直接浏览容器内的文件系统、使用终端,并且像调试本地代码一样无缝调试。
步骤:
-
安装必要插件:
在本地电脑的 VS Code 中,安装以下两个官方插件:
-
Remote - SSH (用于连接远程服务器)
-
Dev Containers (用于连接 Docker 容器)
-
-
连接到远程服务器:
点击 VS Code 左下角的
><绿色/蓝色图标,选择 Connect to Host...,通过 SSH 连接到你的远程物理机。 -
附加到运行中的容器:
-
SSH 连接成功后,按下
Ctrl+Shift+P(或Cmd+Shift+P) 打开命令面板。 -
输入并选择 Dev Containers: Attach to Running Container...。
-
VS Code 会列出远程服务器上正在运行的容器,选择你的容器
ncsb-debug。
-
-
在容器内配置工作区:
-
这时会打开一个新的 VS Code 窗口,代表你已经"进入"了容器内部。
-
点击"打开文件夹",选择你的 Python 项目在容器内的绝对路径(例如
/app或/opt/workspace等)。 -
关键一步 :在当前这个连接到容器的 VS Code 窗口中,打开插件市场,安装 Python 插件(注意:它会提示 "Install in Container ncsb-debug",点击安装)。
-
-
开始调试:
-
在左侧菜单打开"运行和调试"(Ctrl+Shift+D),点击"创建
launch.json文件",选择 Python Debugger -> Python File。 -
打好断点,按
F5即可完美开始调试。
-
方法二:使用 debugpy 通过暴露的端口附加调试 (Remote Attach)
如果你不想在容器里安装 VS Code Server 环境,或者你想直接利用你已经暴露出来的 8000 端口,可以使用这种传统的网络附加调试法。
步骤:
-
在容器内的 Python 环境安装
debugpy:确保你的容器内安装了调试库。进入容器执行:
Bashpip install debugpy -
修改容器内 Python 项目的启动命令:
你需要让 Python 项目通过
debugpy启动,并监听 8000 端口。假设你原来的启动命令是
python main.py,现在需要改为:
Bashpython -m debugpy --listen 0.0.0.0:8000 main.py(💡 提示:如果希望程序暂停,直到你的 VS Code 连上才继续往下走,可以加上
--wait-for-client参数:python -m debugpy --listen 0.0.0.0:8000 --wait-for-client main.py) -
在 VS Code 中配置远程监听:
-
在你的本地电脑上(或者通过 Remote SSH 连接到服务器的工作区中)打开你的代码文件夹。
-
进入"运行和调试"面板,创建或打开
.vscode/launch.json,添加以下配置:
JSON
{ "version": "0.2.0", "configurations": [ { "name": "Python: Remote Attach (Docker on Port 8000)", "type": "python", "request": "attach", "connect": { "host": "你的远程物理机IP", // 如果你是通过 SSH 连接到了物理机并在那打开了 VSCode,这里填 "127.0.0.1" 即可 "port": 8000 }, "pathMappings": [ { "localRoot": "${workspaceFolder}", // 这里是 VS Code 当前打开的代码目录 "remoteRoot": "/your/project/path/in/container" // 【重点】这里必须替换为你代码在容器内部的绝对路径! } ], "justMyCode": true } ] } -
-
开始调试:
确保容器内的代码已经用
debugpy跑起来了。然后在 VS Code 中选择刚才配置的Python: Remote Attach,按F5连接。只要断点变红,就说明连接成功了!
总结建议:
如果你需要经常修改代码并调试,强烈建议使用方法一 。因为方法二中的 pathMappings(路径映射)很容易因为本地代码和容器内代码不一致而导致断点无法命中。方法一直接读取和执行容器内的代码,零心智负担。
你需要我为你详细说明 launch.json 中具体的路径该如何填写,或者关于安装 Dev Containers 插件的更多细节吗?