参考:https://juejin.cn/post/6844904098618163207

nodejs的远程debug比php的要容易一些。

创建nodejs容器

主要做的是把文件移到一个新的node容器里,然后使用npm安装好依赖。

这是我的,参考一下,按情况修改

目录结构

image-20240131224728855.png

dockerfile

FROM node:16.20

COPY start.sh /start.sh
COPY app /app

RUN chmod 777 /start.sh &&\
# package.json 存放依赖和版本,在package.json同级目录执行npm install自动安装所有依赖
# 有时候可能因为网络问题 npm install 安装时卡住
cd /app && mkdir uploads && npm install

CMD ["/bin/bash","/start.sh"]

docker-compose.yml

version: '2.0'
services:
web:
build: ./
ports:
- "17878:8080"
- "19229:9229"
container_name: Ezejs

start.sh

# 如果不加这个,容器启动之后立刻down
sleep infinity

创建好容器之后,attach vscode进去。

vscode配置

进入容器,下载node_modules到本地,放到项目源码位置,和容器内源码目录结构保持一致。

在debug客户端(容器外)的vscode写launch.json

image-20240131225845358.png

{
// 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", // node 调试
"request": "attach", // launch / attach。luanch 为本地调试,attach 为远程/跨进程调试
"name": "Remote server", // 启动配置的名称,在面板中可以选择
"address": "192.168.109.128", // 服务器地址
"port": 19229, // 服务器端口
"localRoot": "${workspaceFolder}", // 本地程序所在的目录
"remoteRoot": "/app" // 服务器对应程序所在的目录

}
]
}

开始debug

容器内的shell,执行node --inspect=0.0.0.0:9229 index.js

容器外vscode,切到index.js,打断点,F5,选择nodejs调试,调试就开始了。

问题

我的测试案例是express项目,有端口监听。如果原本的程序很快就结束了,估计等不到debug attach就结束了。我猜的,没测试过。