Node.js HTTP Get 流在 docker 容器内冻结

Posted

技术标签:

【中文标题】Node.js HTTP Get 流在 docker 容器内冻结【英文标题】:Node.js HTTP Get stream freezes inside docker container 【发布时间】:2021-12-24 19:09:18 【问题描述】:

我使用 http 模块在 nodejs 中编写了以下代码。 它基本上是监听事件流(所以连接是永久的)。

http.get(EVENT_STREAM_ADDRESS, res => 
  res.on('data', (buf) => 
    const str = Buffer.from(buf).toString();
    console.log(str);
  );

  res.on('error', err => console.log("err: ", err));
);

如果我在我的 Mac 上运行上述代码,它可以正常工作,并且我会在多个小时后将 data 记录到控制台。 但是在具有非常基本配置的 Docker 中,它会在一段时间后停止接收数据而不会出现任何错误。应用程序中的其他端点工作正常(例如 Express 端点),但这个 http.get listener 只是挂起。

Dockerfile


FROM node:current-alpine

WORKDIR /app

EXPOSE 4000

CMD npm install && npm run start

你有什么想法可以克服这个问题吗?

要重现我有时需要等待几个小时的情况真的很难调试。

干杯

【问题讨论】:

你检查过容器日志吗?也许主机睡眠并暂停 Docker 容器? 可能是与超时/内存有关的问题,请尝试将控制台日志放在 res.on 之外 【参考方案1】:

我知道可能发生了什么。

问题是 Docker Desktop for Mac。似乎它有时会停止容器,例如在 Mac 进入睡眠状态的情况下。它会中断侦听器,因此它停止接收新的数据块。 我在 VirtualBox 的 Ubuntu 上启动了相同的容器,它一直运行良好。

【讨论】:

以上是关于Node.js HTTP Get 流在 docker 容器内冻结的主要内容,如果未能解决你的问题,请参考以下文章

带有查询字符串参数的node.js http'get'请求

如何从 Node.js http get 请求中获取数据

在 node.js 中的 HTTP GET 中设置 URL 参数的默认值

检测需要很长时间的 node.js http.get 调用

node.js http.get 在向远程站点发出 5 次请求后挂起

Node.js——request/get实现评论功能