如果服务器是从终端启动的,调试器将打开.ts文件;如果服务器是使用docker-compose启动的,调试器将打开.js文件

hl0ma9xz  于 2022-12-11  发布在  Docker
关注(0)|答案(1)|浏览(157)

我的问题是,当我在代码中放置debugger;语句时,如果我从终端使用npm run start:debug启动NestJS应用程序,调试器将暂停在相应的.ts文件中,但如果我从docker-compose.yml启动服务器,调试器将暂停在构建的.js文件中,而不是.ts文件中。
为了重现一个最小的示例,我从docs启动了一个新的NestJS项目

git clone https://github.com/nestjs/typescript-starter.git projet
cd project
npm run install

然后,我添加了下面的.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": "Attach NestJS",
      "port": 9229,
      "restart": true,
      "stopOnEntry": false,
      "protocol": "inspector",
      "sourceMaps": true
    }
  ]
}

我已将app.service.ts更新为以下内容(我已添加debugger;

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    debugger;

    return 'Hello World!';
  }
}

如果我运行npm run start:debug,用我的AttachNestJS配置附加调试器,然后转到http://localhost:3000/,调试器将在src/app.service.ts停止。
如果我创建一个Dockerfile

FROM node:14.18-alpine

WORKDIR /usr/src/app

COPY package-lock.json package.json ./

RUN npm install
COPY . .

一个docker-compose.yml

version: '3.7'

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
    command: npm run start:debug:docker
    volumes:
      - ./:/usr/src/app
    ports:
      - '8000:3000'
      - '9229:9229'

一个1 m14n1x

node_modules
.git
dist

并更新脚本中的debug start命令,以便调试器将绑定到容器

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

然后运行docker-compose up --build,服务器启动,我可以附加调试器,如果我转到http://localhost:8000/,调试器不会在src/app.service.ts中停止,而是在app.service.js中停止。
请注意,我需要在文件中显式地写入debugger;,以便它停止,设置断点将导致“未绑定断点”。
由于当服务器在docker外部运行时调试器正确地停止在.ts文件中,我不认为我的typescript配置有问题,它是在克隆NestJS repo后开箱即用的配置。
我已为此问题创建了一个repo
提前感谢您的帮助

tcomlyy6

tcomlyy61#

我偶然发现了这个youtube video,它显示了我的问题的解决方案。
关键是在launch.json中的配置中添加"remoteRoot": "/usr/src/app",/usr/src/app是dockerfile中WORKDIR /usr/src/app旁边的内容

相关问题