如何在 Docker 容器中调试 Node.js

2025-05-24

如何在 Docker 容器中调试 Node.js

越来越多的团队正在将其开发环境迁移到 Docker 容器。它带来了诸多优势,例如所有开发人员共享的统一环境、更快的新成员入职流程以及可预测的部署。例如,在我之前的文章“微服务 vs 单体架构”中,我指出,使用微服务必须使用 Docker,否则您将在本地计算机上启动多个微服务,开发过程将变得非常繁琐。即使您有 5-10 个微服务,您也需要通过终端逐个运行它们,并且必须确保已安装所有依赖项、数据库、ElasticSearch 等。或者,您可以使用 docker-compose 仅​​用一个命令即可运行它,这是一种更好的方法。

但这种方法需要你了解 Docker,并且不会错过没有 Docker 时所拥有的功能或体验。其中一项需要了解的是如何调试 Docker 容器。在本文中,我们将介绍一些
在 Docker 容器中调试 Node.js 应用程序的用例。

先决条件

案例

  • Node.js、Docker,无 Nodemon
  • Node.js、Docker、Nodemon
  • Node.js、Docker 和 docker-compose

Node.js、Docker,无 Nodemon

如果您已经有 Node.js 应用程序的 Dockerfile,它可能看起来像这样:



FROM node:10-alpine

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

CMD [ "npm", "start" ]


Enter fullscreen mode Exit fullscreen mode

为了继续,我们需要构建 Dockerfile。我建议使用 VS Code Docker 扩展,并按如下所示开始构建:

要在 Node.js 中启用调试器,我们需要使用--inspect--inspect-brk,但由于我们的应用程序将在 Docker 内部启动,因此我们还需要通过传递0.0.0.0来允许从外部网络访问我们的调试器。



 "scripts": {
    "start": "node --inspect=0.0.0.0 index.js"
  },


Enter fullscreen mode Exit fullscreen mode

现在,执行npm start该命令时,Node.js 会在单独的端口(默认为 9229)上运行 Node.js 调试器,然后您可以将调试器工具连接到该端口。要访问调试器,您还必须将 9229 端口暴露给主机。您可以使用以下命令执行此操作:



docker run --rm -d -p 3000:3000 -p 9229:9229 -v ${PWD}:/usr/src/app -v /usr/src/app/node_modules example:latest


Enter fullscreen mode Exit fullscreen mode

使用该命令,我们将 Dockerized 应用程序的 3000 和 9229 端口公开到 localhost,然后将包含应用程序的当前文件夹挂载到 /usr/src/app,并使用 hack 来防止通过 Docker 从本地机器覆盖节点模块。

现在我们可以使用 VS Code 向导的调试启动任务进行配置。按下 CMD(Ctrl)+Shift+P(命令面板)并找到“Debug: Open launch.json”:


然后选择 Docker:Node.js:


这将生成一个包含以下内容的 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": [
        {
            "name": "Docker: Attach to Node",
            "type": "node",
            "request": "attach",
            "port": 9229,
            "address": "localhost",
            "localRoot": "${workspaceFolder}",
            "remoteRoot": "/usr/src/app",
            "protocol": "inspector"
        }
    ]
}


Enter fullscreen mode Exit fullscreen mode

Docker 的配置是手动连接到调试器端口并将本地根文件夹映射到远程,以保持断点定义有效。

转到 VS Code 的调试页面,按“播放”按钮即可在 Docker 中享受调试。

Node.js、Docker 和 Nodemon

当我们想将调试器与 nodemon 一起使用时,就会出现细微的差别。首先,package.json 中的脚本应如下所示:



"start": "nodemon --inspect=0.0.0.0 src/index.js",


Enter fullscreen mode Exit fullscreen mode

然后,由于 nodemon 会在每次更改后重启你的应用,你的调试器将会丢失连接。发生这种情况时,有一个选项“restart: true”,它会让你在每次重启后尝试重新连接到调试器。

所以你的 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": [
        {
            "name": "Docker: Attach to Node",
            "type": "node",
            "request": "attach",
            "port": 9229,
            "address": "localhost",
            "localRoot": "${workspaceFolder}",
            "remoteRoot": "/usr/src/app",
            "protocol": "inspector",
            "restart": true
        }
    ]
}


Enter fullscreen mode Exit fullscreen mode

转到 VS Code 的调试页面,按“播放”按钮,然后像以前一样享受在 Docker 中的调试。

Node.js、Docker 和 docker-compose

第三种选择是使用 docker-compose 运行你的 docker 镜像,如果你的服务还需要数据库或其他可以使用 Docker 运行的依赖项,那么这种方法很好。

在您的应用程序文件夹中创建一个docker-compose.yaml,其中包含以下内容:



version: '3'

services:
  example-service:
    build: .
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - 3000:3000
      - 9229:9229
    command: npm start


Enter fullscreen mode Exit fullscreen mode

我们使用的指令与非 docker-compose 解决方案基本相同,只是将它们转换为 yaml 格式。现在,您可以继续使用 nodemon 或 node.js 运行选项来处理 launch.json 文件,并使用前面几节中介绍的 Debugger。

文章来源:https://dev.to/alex_barashkov/how-to-debug-nodejs-in-a-docker-container-bhi
PREV
如何在 React 中为不同用户隐藏功能 A 并显示功能 B
NEXT
面向开发人员的 20 个 Docker 命令用例