已解决

如何在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,这会让调试器监听所有网络接口。 如果只用 localhost127.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