gpt4 book ai didi

node.js - 使用 docker 在更改的文件上停止使用 vscode 中的 --watch 调试 nestjs 应用程序

转载 作者:行者123 更新时间:2023-12-04 01:09:44 25 4
gpt4 key购买 nike

我正在尝试调试 --watch 中的 typescript nestjs 应用程序Visual Studio 代码(使用 Docker 扩展)中的模式(因此它会在文件更改时重新启动)。代码通过使用卷挂载在 docker 中。
它几乎完美运行,docker 正确启动,调试器可以附加,但是我有一个似乎无法解决的问题:
一旦文件发生更改,观察者就会将其捡起,我在 docker logs -f 中看到以下内容对于容器:

[...]
[10:12:59 AM] File change detected. Starting incremental compilation...

[10:12:59 AM] Found 0 errors. Watching for file changes.

Debugger listening on ws://0.0.0.0:9229/af60f5e3-394d-4df3-a565-8d15898348bf
For help, see: https://nodejs.org/en/docs/inspector
user@system:~$
# (at this point the docker logs command stops and the docker is gone)
此时 vscode 结束调试 session ,docker 停止(反之亦然?),我必须手动重新启动它。
如果我手动启动完全相同的 docker 命令(从 vscode 终端窗口复制/粘贴),它不会在更改文件时停止。这是它生成的命令:
docker run -dt --name "core-dev" -e "DEBUG=*" -e "NODE_ENV=development" --label "com.microsoft.created-by=visual-studio-code" -v "/home/user/projects/core:/usr/src/app" -p "4000:4000" -p "9229:9229" --workdir=/usr/src/app "node:14-buster" yarn run start:dev --debug 0.0.0.0:9229
我确实尝试使用 strace 查看会发生什么,这就是我在更改任何文件时在 Node 进程中看到的内容:
strace: Process 28315 attached
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=40, si_uid=0, si_status=SIGTERM, si_utime=79, si_stime=9} ---
+++ killed by SIGKILL +++
killed by SIGKILL线路确实 不是 手动运行 docker 时会发生,只有在调试时从 vscode 启动时才会发生。
希望有人知道我哪里出错了。
以下是相关配置:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Docker Node.js Launch",
"type": "docker",
"request": "launch",
"preLaunchTask": "docker-run: debug",
"platform": "node"
}
]
}
任务.json
{
"version": "2.0.0",
"tasks": [
{
"type": "docker-run",
"label": "docker-run: debug",
"dockerRun": {
"customOptions": "--workdir=/usr/src/app",
"image": "node:14-buster",
"command": "yarn run start:dev --debug 0.0.0.0:9229",
"ports": [{
"hostPort": 4000,
"containerPort": 4000
}],
"volumes": [
{
"localPath": "${workspaceFolder}",
"containerPath": "/usr/src/app"
}
],
"env": {
"DEBUG": "*",
"NODE_ENV": "development"
}
},
"node": {
"enableDebugging": true,
}
}
]
}
这是一个 hello world 仓库: https://github.com/strikernl/nestjs-docker-hello-world

最佳答案

所以这就是我发现的。当您更改代码时,它会重新启动 Node 的调试器进程。当 Docker 容器失去与调试器的连接时,VSCode 会杀死它。
有一个很好的功能可以在代码更改时重新启动调试器 session (请参阅 this link )但问题是 - 它适用于 "type": "node"启动配置。你的是 "type": "docker" .来自 optionsnode只有autoAttachChildProcesses看起来很有希望,但它并没有解决问题(我已经检查过)。
所以我的建议是:

  • 创建一个 docker-compose.yml文件,它将启动容器而不是 VSCode。
  • 编辑您的 launch.json以便它连接到 node在容器中并在更改时重新启动调试器 session 。
  • 移除/返工 tasks.json因为在当前状态下不需要它。

  • docker-compose.yml :
    version: "3.0"

    services:
    node:
    image: node:14-buster
    working_dir: /usr/src/app
    command: yarn run start:dev --debug 0.0.0.0:9229
    ports:
    - 4000:4000
    - 9229:9229
    volumes:
    - ${PWD}:/usr/src/app
    environment:
    DEBUG: "*"
    NODE_ENV: "development"
    launch.json :
    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Attach to node",
    "type": "node",
    "request": "attach",
    "restart": true,
    "port": 9229
    }
    ]
    }
    保存 docker-compose.yml在您的项目根目录中并使用 docker-compose up启动容器(您可能需要先安装它 https://docs.docker.com/compose/ )。一旦它正常工作,就可以像往常一样启动调试器。

    关于node.js - 使用 docker 在更改的文件上停止使用 vscode 中的 --watch 调试 nestjs 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65231927/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com