当前位置: 首页 > 知识库问答 >
问题:

Docker容器中的调试节点

阮选
2023-03-14

我正在为nodejs应用程序上的典型开发人员规划工作流。我想你们大多数人都会:

git clone[appcode](具有卷映射到本地路径的Dockerfile)

然后我编辑一些代码,最好使用像WebStorm或文本编辑器Sublime等IDE。然后终端Ctrl C终止当前进程

以上所有内容看起来都很标准吗?

我的主要问题是,是否有人使用IDE或节点检查对容器进行调试?

我尝试过暴露端口等..连接被拒绝。我相信是因为node.js只允许在127.0.0.1:5858上调试

共有3个答案

宿淳
2023-03-14

在这种情况下,对调试器(节点调试)和应用服务器(自定义节点)使用两个不同的映像没有任何意义。由于自定义节点容器也需要安装节点检查器二进制文件。否则,“找不到模块”/usr/lib/node_modules/节点检查器/库/注入器服务器.js“错误将推送到节点检查器客户端控制台中,并且也没有进行任何调试。

许正平
2023-03-14

在努力工作了一段时间后,我发现添加:

--检查-brk=0.0.0.0:9229

而不仅仅是通常的检查-brk

让事情运转起来。

您还需要在docker run命令中正确映射端口:

-p 9229:9229

完整示例:

docker run -ti -p 3000:3000 -p 9229:9229 -v `pwd`:/app/ myImage bash

node --inspect-brk=0.0.0.0:9229 /app/index.js

然后去chrome://inspect

并点击“打开节点专用开发工具”,它应该都可以工作:)

姬承教
2023-03-14

我设法让它在这里运行。我希望我可以运行节点检查器作为一个助手容器,这将是如此干净(编辑:这是可能的,见答案结束)。不幸的是,查看node-inspector源代码时,不可能远程运行node-inspector(因为node-inspector需要访问文件才能显示它们),因此甚至连容器链接都不存在。也许在某个时候会支持它。

以下是我的解决方案:

在Dockerfile中,安装节点检查器。我决定让它全球化,这样我就可以使用同一个容器来调试我所有的应用程序。

RUN npm install -g node-inspector

不要在CMD命令中使用午餐节点,而是使用bash脚本,该脚本将允许您启动多个进程。这不是Docker的方式,但正如我所说,节点检查器中的限制阻止我们使用同伴容器。您还可以使用更强大的解决方案进行流程管理,例如主管,但在我看来,对于调试,一个简单的脚本就足够了。

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

此脚本检查是否存在DEBUG环境变量以启动节点并启用调试。

#!/bin/bash

if [ -z ${DEBUG+x} ]; then
  node server.js
else
  node-inspector --web-port 9080 &
  node --debug server.js
fi

我想您可以使用相同的技巧来安装或不安装节点检查器。如果要跳过脚本进行安装,甚至可以在RUN命令中使用条件语句。

然后,当您想调试一个容器时,像这样启动它:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
    -v /home/docker/sources/.../:/usr/src/app custom-node

现在您只需要点击docker守护进程ip进行调试,因为我们在<code>docker run

如果您的容器运行在本地VM上,并且您设置在代理之后,请确保它支持本地地址,或者在调试之前禁用它。

编辑:现在与sidekick容器一起工作

下面是我的节点调试容器docker文件的内容

FROM node:4.2.1

EXPOSE 9080

RUN npm install -g node-inspector

CMD ["node-inspector", "--web-port", "9080"]

Docker为我们提供了两个特性,让我们觉得node-inspector就像是在本地与节点进程一起运行。

>

  • 即使节点检查器似乎暗示您可以通过告诉您连接到127.0.0.1:8080/?ws=127.0.0.1来连接到远程计算机

    通过使用与调试的进程相同的挂载点,可以将文件局部性伪造成节点检查器进程。

    现在,为了让它更方便一点,我建议您对应用程序源使用数据容器。

    如果你想在调试中启动节点,继续使用start.sh脚本(虽然删除了节点检查器命令)。我想知道我们是否可以使用docker的信号,这将完全消除对start.sh的依赖。

    if [ -z ${DEBUG+x} ]; then
      node server.js
    else
      node --debug server.js
    fi
    

    因此,创建数据容器:

    docker create -v /home/docker/sources/.../:/usr/src/app  \
        --name my_service-src custom-node /bin/true
    

    启动节点应用程序并公开node-检查器调试端口:

    docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
        --volumes-from my_service-src custom-node
    

    启动节点调试容器:

    docker run -d --net=container:my_service --volumes-from my_service-src \
        --name node-debug node-debug
    

    这样,您可以快速生成节点调试容器来调试节点流程。

    连接到docker ip,享受您的调试会话!

  •  类似资料:
    • 我很难弄清楚如何设置在Docker容器中运行的python应用程序(Flask)的远程调试。具体来说,我使用的是docker compose、PyCharm professional和python 3.5。这就是我到目前为止所做的: > 我把pycharm-debug-py3k.egg复制到项目文件夹 我在wsgi.py文件中添加了以下行: 我在PyCharm中创建了一个远程调试配置(通过将本地机

    • 问题内容: 我有一个正在运行的Docker容器。我已经在运行的Docker容器中做了一些有用的工作。我已经完成了这些工作,而不是dockerfile的一部分,我已经在容器内完成了它。[例如:我已经在容器内安装了ping,而不是从docker文件中安装了ping] 现在,我被困在一个地方。我不确定是否要在同一个容器中进行调试,否则可能会使到目前为止在容器中所做的事情松懈。 因此,我想使用该运行容器中

    • 因此,我想用运行容器中的所有可用内容创建一个它的副本[就像我不想从image构建一个容器,重复运行容器中实现的所有重要步骤,然后开始调试一样。我不想在第二个容器中重新安装ping]。 完全如此,我如何复制一个容器?如果不是,所有的可能性是什么?

    • 我在这个repo中用2个图像制作了3个docker容器,使用MongoDB公共图像制作了1个。我使用 < code>docker-compose.yaml是: 但是MongoDB无法与节点服务器连接,并给出了以下错误: < code>backend/db.js的代码: 添加mongouri作为环境变量后的终端输出: 新错误:

    • 我有几个存储库在Docker容器中运行node.js应用程序。当我在WebStorm中一起打开它们并开始调试其中一个(使用Node.js远程调试配置)时,调试器会打开Docker容器内的源文件,而不是原来的文件。如果我在WebStorm的不同实例中单独打开同一个项目,调试器会如预期的那样在原始文件中停止。 知道是什么导致了这种行为吗?

    • 我试图找出如何在Visual Studio2015中调试在Docker容器中执行的单元测试和集成测试。 null