在本文中,我们将来学习如何在Docker容器里Debug 一个Node.js应用。
你也许要问,我干嘛要学这个呀?答案很简单:
很多时候,你需要在本地运行你的应用,使用容器时只能装database和消息队列(MSMQ)。但是很多的Bug只有在整个APP都容器化的时候才会 现出原形,这时候,懂得在服务里加上一个调试器就很有用处了。
有调查显示,将近一半的Node.js开发者都使用Docker。而容器化,毫无疑问是非常强大的工具。
如何使用Node inspector?
如果你总是用printf这种原始的方式,要及时找到需要的东西实在太难了。
要是你每次添加console.log后都要重建你的 container image,那就更狗血了。但是如果实在它运行的时候就一次建好image,然后检查你的变量,这样就容易多了。为了方便你理解接下来要做的事,建议你先熟悉一下node inspector命令。
让你的Node应用在调试模式下运行,只需要在node后面添上inspect ,比如这样:
image
开启调试模式后,通常代码会在第一行停下来,等待你的互动。对于一直使用gdb调试代码的人,这个界面会很舒服;但是如果习惯了使用GUI跟调试器交互,你可能会有打开Chrome进入到chrome://inspect的冲动。
你会看到这样的界面:
在远程模目标下,点击inspect 就会出现Chrome开发者工具调试器。
image
在Docker容器中调试Node.js
首先,新建一个Dockerfile
image然后添加docker-compose.yaml
image接着运行docker-compose up,就能够在http://localhost:3000连接上服务。
接下来就是把调试接口公开出来。让我们先来创建一个debug-compose.yaml
image如上所示,我们开启了一个接口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了:
image使用VS Code进行调试
尽管使用inspector发现单个文件的问题很方便,要检查起整个项目就麻烦了。在这种情况下,把调试器添加进IDE就会好很多。这里我们以VS Code为例:
首先,找到debug按钮,然后点击设置按钮
然后,在弹出列表中选择Docker(确保你已安装Docker插件)
image这时,就会在.vscode项目汇总生成一个launch.json文件:
注意,我们的应用根目录是在容器文件系统里,因此需要更新一下;完成后应该如下:
此时,如果你按下F5,调试器就会在VS Code中出现,再次点击,服务器就开始监听。如果你在某处设置一个断点(breakpoint)并调用服务器http://localhost:3000,就会看到如下界面:
注:本文翻译自著名技术博客RisingStack;作者:Tamas Kadlecsik;原文地址:https://blog.risingstack.com/how-to-debug-a-node-js-app-in-a-docker-container/;翻译:实验楼扫地阿姨。
今日推荐:
image
网友评论