如何用VSCode调试Docker容器中双端口运行的Node.js应用?
如何将VSCode调试器附加到运行多Node.js应用的Docker容器
当然可以实现,以下是具体的步骤:
1. 为两个Node.js应用启用调试模式
Node.js默认不会开启调试端口,你需要修改每个项目的启动脚本,指定不同的调试端口(避免冲突),并绑定到容器的所有网卡(0.0.0.0),确保外部能访问:
Web项目:修改
package.json的scripts字段:"scripts": { "dev": "node --inspect=0.0.0.0:9229 src/index.js" }如果用
nodemon热重载,改成:"scripts": { "dev": "nodemon --inspect=0.0.0.0:9229 src/index.js" }API项目:同理,使用另一个调试端口(比如9230):
"scripts": { "dev": "node --inspect=0.0.0.0:9230 src/index.js" }
2. 更新Docker配置,暴露调试端口
不管你用Dockerfile还是docker-compose.yml,都需要把调试端口和业务端口一起暴露并映射到宿主机:
用Dockerfile的情况
添加EXPOSE指令:
# 暴露业务端口和调试端口 EXPOSE 3000 4000 9229 9230
(注:3000是Web业务端口,4000是API业务端口,根据你的实际情况调整)
用docker-compose.yml的情况
在服务的ports字段添加端口映射:
services: your-app: build: . ports: - "3000:3000" # Web业务端口映射 - "4000:4000" # API业务端口映射 - "9229:9229" # Web调试端口映射 - "9230:9230" # API调试端口映射 volumes: - ./web:/app/web # 挂载本地Web代码到容器,确保代码同步 - ./api:/app/api # 挂载本地API代码到容器
(卷挂载很重要,确保本地修改的代码和容器内一致,避免调试断点不生效)
之后重新构建并启动容器:
docker-compose up --build
3. 配置VSCode调试文件
在VSCode中,打开项目根目录,创建.vscode/launch.json文件,添加两个调试配置,分别对应Web和API应用:
{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "attach", "name": "Attach to Web (Docker)", "port": 9229, "address": "localhost", "localRoot": "${workspaceFolder}/web", "remoteRoot": "/app/web" }, { "type": "node", "request": "attach", "name": "Attach to API (Docker)", "port": 9230, "address": "localhost", "localRoot": "${workspaceFolder}/api", "remoteRoot": "/app/api" } ] }
参数说明:
localRoot:本地机器上对应项目的文件夹路径remoteRoot:容器内该项目的存放路径,必须和你Docker配置的工作目录一致
4. 启动调试
- 确认Docker容器已启动,且两个应用都通过
npm run dev正常运行(此时调试端口已开启) - 在VSCode的调试面板(Ctrl+Shift+D),选择对应的调试目标(比如"Attach to Web (Docker)")
- 点击启动按钮,调试器会自动附加到容器内的应用
- 现在可以在本地代码中设置断点,调试容器内的Node.js应用了
注意事项
- 务必保证本地代码和容器内代码完全同步,推荐用Docker卷挂载实现,否则断点可能不生效
- 如果使用
nodemon,应用重启后调试器会断开,需要重新附加;若想启动时暂停应用,可以用--inspect-brk替代--inspect - 调试端口不能和业务端口冲突,且两个应用的调试端口必须唯一
内容的提问来源于stack exchange,提问作者Pandiyan Cool
相关产品推荐
相关产品推荐

