结论:不能用 type: "docker" 自动配置,必须手动设为 type: "node" + request: "attach",否则断点基本不命中;因其依赖预装工具、标准路径和固定 WORKDIR,而真实项目常自定义启动逻辑、覆盖 ENTRYPOINT 或间接调用 node,导致调试器无法注入或源码映射失败。

直接说结论:不能用 type: "docker" 自动配置,必须手动设为 type: "node" + request: "attach",否则断点基本不命中。
为什么 type: "docker" 配置经常失败
VS Code 官方 Docker 扩展的 type: "docker" 调试模式依赖镜像内预装调试工具、标准启动路径和固定工作目录。但真实项目往往自定义 WORKDIR、用 ENTRYPOINT 覆盖启动逻辑、或通过 npm start 间接调用 node——这些都会让扩展无法自动注入调试器或解析源码映射。
常见现象包括:断点灰色、hover 看不到变量、console.log 不输出、调试器连接后立刻断开。
实操建议:
- 删掉
launch.json里所有"type": "docker"的配置项 - 改用
"type": "node"+"request": "attach",自己控制端口、路径和监听地址 - 不要依赖 Docker 扩展生成的
docker-buildtask,它常和你实际构建流程冲突
launch.json 必须填对的三个字段
手动配置的最小可靠结构只有三处不能错:
"port":必须和容器内 --inspect=0.0.0.0:9229 的端口号完全一致(默认是 9229,别写成 9228 或漏掉)
"localRoot":固定写 "${workspaceFolder}",不要加 /src 或 /dist 后缀
"remoteRoot":必须和 Dockerfile 中 WORKDIR 完全匹配,比如 WORKDIR /app 就写 "/app";如果用了 COPY . /usr/src/app,这里就得是 "/usr/src/app"
示例(精简版,可直接粘贴):
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Node in Docker",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/app"
}
]
}
Dockerfile 和运行命令的关键修改点
容器内不启动调试服务,VS Code 连上去也是空的。重点不是“怎么写 Dockerfile”,而是“怎么让调试端口真正生效”:
-
CMD或ENTRYPOINT必须显式带--inspect=0.0.0.0:9229,写成--inspect=localhost:9229或--inspect=127.0.0.1:9229都连不上 -
EXPOSE 9229是文档性质,没用;真正起作用的是docker run -p 9229:9229或docker-compose.yml里的ports: ["9229:9229"] - 本地代码和容器内代码不同步?用
-v ${PWD}:/app挂载整个项目根目录,比 COPY 更适合开发 - Node.js 版本低于 8.0?断点一定失效——检查
docker exec -it your-container node -v,不是看宿主机版本
调试前必须验证的两件事
很多问题其实卡在最前面一步,而不是配置本身:
第一,确认容器内调试服务已就绪:进容器执行 netstat -tuln | grep 9229,有输出才说明 node 真正在监听;没有就说明 --inspect 参数没生效,或者被 npm start 的 wrapper 层吞掉了(此时要改 package.json 的 script,把 node --inspect=... 写进去)
第二,确认 VS Code 终端能访问该端口:在 VS Code 内置终端里执行 telnet localhost 9229(macOS/Linux)或 Test-NetConnection localhost -Port 9229(PowerShell),通了才能连
这两步跳过,后面所有配置都是白忙。


















