找Bug秘技:如何在Docker容器中调试Node.js应用?

640?wx_fmt=png


在本文中,我们将来学习如何在Docker容器里Debug 一个Node.js应用。

你也许要问,我干嘛要学这个呀?答案很简单:

很多时候,你需要在本地运行你的应用,使用容器时只能装database和消息队列(MSMQ)。但是很多的Bug只有在整个APP都容器化的时候才会  现出原形,这时候,懂得在服务里加上一个调试器就很有用处了。

有调查显示,将近一半的Node.js开发者都使用Docker。而容器化,毫无疑问是非常强大的工具。


如何使用Node inspector?

如果你总是用printf这种原始的方式,要及时找到需要的东西实在太难了。

要是你每次添加console.log后都要重建你的 container image,那就更狗血了。但是如果实在它运行的时候就一次建好image,然后检查你的变量,这样就容易多了。为了方便你理解接下来要做的事,建议你先熟悉一下node inspector命令。

让你的Node应用在调试模式下运行,只需要在node后面添上inspect ,比如这样:

640?wx_fmt=png

开启调试模式后,通常代码会在第一行停下来,等待你的互动。对于一直使用gdb调试代码的人,这个界面会很舒服;但是如果习惯了使用GUI跟调试器交互,你可能会有打开Chrome进入到chrome://inspect的冲动。

你会看到这样的界面:

640?wx_fmt=png在远程模目标下,点击inspect 就会出现Chrome开发者工具调试器。

640?wx_fmt=png



在Docker容器中调试Node.js

首先,新建一个Dockerfile

640?wx_fmt=png

然后添加docker-compose.yaml

640?wx_fmt=png

接着运行docker-compose up,就能够在http://localhost:3000连接上服务。

接下来就是把调试接口公开出来。让我们先来创建一个debug-compose.yaml

640?wx_fmt=png

如上所示,我们开启了一个接口9229,这就是Node.js App的调试接口。同时我们也重写了在Dockerfile中指定的命令;--inspect-brk=0.0.0.0这个参数起到两个作用:

1.--inspect告诉Node我们想要在调试模式运行App。
2.通过添加-brk,来确保应用在第一行停下来,这样我们就有足够时间打开inspector
3.添加=0.0.0.0使得我们可以从任意IP地址连接调试器。

inspector的默认地址是
127.0.0.1,因为我们不会想要别人随便给我们的App添加调试器。然而,容器和我们的IP以及主机都不相同,我们是无法连接的。当我们在本地连接时没有问题,当我们肯定不会只放在本地。因此,一定要确保这里的调试文件和你的docker-compose.yaml不能相同。

同时要注意,接口的转发规则是在 " 里面的,忽略这一点就很可能出问题,并且难以自发现。到这里,你就可以调试你的App了:

640?wx_fmt=png
使用VS Code进行调试

尽管使用inspector发现单个文件的问题很方便,要检查起整个项目就麻烦了。在这种情况下,把调试器添加进IDE就会好很多。这里我们以VS Code为例:

首先,找到debug按钮,然后点击设置按钮

640?wx_fmt=jpeg

然后,在弹出列表中选择Docker(确保你已安装Docker插件)

640?wx_fmt=png

这时,就会在.vscode项目汇总生成一个launch.json文件:

640?wx_fmt=png

注意,我们的应用根目录是在容器文件系统里,因此需要更新一下;完成后应该如下:

640?wx_fmt=png

此时,如果你按下F5,调试器就会在VS Code中出现,再次点击,服务器就开始监听。如果你在某处设置一个断点(breakpoint)并调用服务器http://localhost:3000,就会看到如下界面:

640?wx_fmt=png

注:本文翻译自著名技术博客RisingStack;作者:Tamas Kadlecsik;原文地址:https://blog.risingstack.com/how-to-debug-a-node-js-app-in-a-docker-container/;翻译:实验楼扫地阿姨。

∞∞∞

640?wx_fmt=png

公众号回复“IT派”

邀你加入IT派 { 技术青年圈} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值