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
相关产品推荐
相关产品推荐

