如何在Docker容器中调试Node.js应用?
我在本地开发环境使用Docker运行Node.js应用,但无法正常使用debugger进行调试。 具体情况如下:
- 使用 docker-compose 启动应用
- 在 VS Code 中配置了 launch.json
- 暴露了 9229 调试端口
- 但是断点无法生效,VS Code 提示连接不上调试器
我的 docker-compose.yml 配置:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
- "9229:9229"
volumes:
- .:/app
command: npm run dev
launch.json 配置:
{
"type": "node",
"request": "attach",
"name": "Docker: Attach to Node",
"remoteRoot": "/app",
"localRoot": "${workspaceFolder}",
"port": 9229
}
有没有人遇到过类似的问题?应该如何配置才能正常调试?
3 个回答
已采纳
王
问题出在你的 Node.js 启动命令上。需要在启动时加上 --inspect 参数,
并且要绑定到 0.0.0.0 而不是默认的 localhost,这样才能在容器外访问调试端口。
修改你的 package.json 中的 dev 脚本:
{
"scripts": {
"dev": "node --inspect=0.0.0.0:9229 index.js"
}
}
或者直接在 docker-compose.yml 中修改 command:
command: node --inspect=0.0.0.0:9229 index.js
关键点是 0.0.0.0,这会让调试器监听所有网络接口。
如果只用 localhost 或 127.0.0.1,
调试端口只能在容器内部访问,外部无法连接。
配置完成后,重新构建并启动容器,VS Code 就能正常连接了。
张
补充一下,如果使用 nodemon 进行热重载开发,可以这样配置:
"dev": "nodemon --inspect=0.0.0.0:9229 index.js"
另外建议在 .dockerignore 中排除 node_modules,避免本地和容器内的依赖版本不一致。
赵
除了上面提到的方法,还可以考虑使用 Docker 的 --init 参数,
这样可以确保信号正确传递给 Node.js 进程,避免调试时的一些奇怪问题。
docker run --init -p 9229:9229 your-image