You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS Docker调试问题:VSCode断点无法触发求助

解决Docker容器中NestJS调试断点无法触发的问题

问题场景

使用Docker Compose启动NestJS开发环境,配置VS Code远程调试后,断点无法在本地代码处触发。相关配置及环境如下:

Dockerfile

FROM node:12.13-alpine As development

WORKDIR /usr/src/app

COPY package*.json ./

RUN apk add --no-cache bash && npm install --only=development

COPY . .

RUN npm run build

FROM node:12.13-alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --only=production

COPY . .

COPY --from=development /usr/src/app/dist ./dist

CMD ["node", "dist/main"]

docker-compose.yml

version: '3.7'

services:
  main:
    container_name: main
    build:
      context: .
      target: development
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - ${SERVER_PORT}:${SERVER_PORT}
      - 9229:9229
    command: npm run start:debug
    env_file:
      - .env

package.json 脚本

"start:debug": "nest start --debug 0.0.0.0:9229 --watch"

.vscode/launch.json

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
  {
    "type": "node",
    "request": "attach",
    "name": "Debug",
    "address": "127.0.0.1",
    "port": 9229,
    "sourceMaps": true,      
    "restart": true,
    "localRoot": "${workspaceFolder}",
    "remoteRoot": "/usr/src/app",
    "skipFiles": ["<node_internals>/**"]
  }
]
}

环境:Mac 12.6,Docker 20.10.13


解决方案

1. 修正Dockerfile开发阶段的构建逻辑

当前Dockerfile的development阶段执行了npm run build,但docker-compose通过volume把本地目录映射到容器的/usr/src/app,导致容器内预构建的dist文件夹被本地文件覆盖,source map路径不匹配。移除开发阶段的预构建步骤,由nest start --watch实时编译生成source map:

FROM node:12.13-alpine As development

WORKDIR /usr/src/app

COPY package*.json ./

RUN apk add --no-cache bash && npm install --only=development

# 移除预构建命令,由nest start --watch实时处理
# RUN npm run build

COPY . .

2. 确保tsconfig.json启用source map

检查项目根目录的tsconfig.json,确认sourceMap配置为true,这是调试器映射TS源码的基础:

{
  "compilerOptions": {
    // 其他配置...
    "sourceMap": true
  }
}

3. 调整VS Code launch.json配置

在launch.json中添加outFiles字段,明确指定本地编译后的JS文件路径,帮助调试器关联source map与源码:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Debug",
      "address": "127.0.0.1",
      "port": 9229,
      "sourceMaps": true,      
      "restart": true,
      "localRoot": "${workspaceFolder}",
      "remoteRoot": "/usr/src/app",
      "skipFiles": ["<node_internals>/**"],
      // 指定本地编译产物路径
      "outFiles": ["${workspaceFolder}/dist/**/*.js"]
    }
  ]
}

4. 重启服务并重新附加调试器

执行以下命令重启容器,确保配置生效:

docker-compose down && docker-compose up --build

之后在VS Code中重新启动调试会话(F5),断点即可正常触发。


内容的提问来源于stack exchange,提问作者monkeyUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:05:31