如何在 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" ]
为了继续,我们需要构建 Dockerfile。我建议使用 VS Code Docker 扩展,并按如下所示开始构建:
要在 Node.js 中启用调试器,我们需要使用--inspect或--inspect-brk,但由于我们的应用程序将在 Docker 内部启动,因此我们还需要通过传递0.0.0.0来允许从外部网络访问我们的调试器。
"scripts": {
"start": "node --inspect=0.0.0.0 index.js"
},
现在,执行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
使用该命令,我们将 Dockerized 应用程序的 3000 和 9229 端口公开到 localhost,然后将包含应用程序的当前文件夹挂载到 /usr/src/app,并使用 hack 来防止通过 Docker 从本地机器覆盖节点模块。
现在我们可以使用 VS Code 向导的调试启动任务进行配置。按下 CMD(Ctrl)+Shift+P(命令面板)并找到“Debug: Open 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"
}
]
}
Docker 的配置是手动连接到调试器端口并将本地根文件夹映射到远程,以保持断点定义有效。
转到 VS Code 的调试页面,按“播放”按钮即可在 Docker 中享受调试。
Node.js、Docker 和 Nodemon
当我们想将调试器与 nodemon 一起使用时,就会出现细微的差别。首先,package.json 中的脚本应如下所示:
"start": "nodemon --inspect=0.0.0.0 src/index.js",
然后,由于 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
}
]
}
转到 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
我们使用的指令与非 docker-compose 解决方案基本相同,只是将它们转换为 yaml 格式。现在,您可以继续使用 nodemon 或 node.js 运行选项来处理 launch.json 文件,并使用前面几节中介绍的 Debugger。
文章来源:https://dev.to/alex_barashkov/how-to-debug-nodejs-in-a-docker-container-bhi