【问题标题】:ECONNREFUSED Inside of Docker Container; Accessing Remote APIECONNREFUSED 在 Docker 容器内部;访问远程 API
【发布时间】:2020-06-04 06:01:30
【问题描述】:

最近,我一直在构建一个 nodejs 机器人来在 phpbb 论坛上运行游戏。我让机器人在我的机器上本地运行(登录、发布、抓取线程等),所以很自然地,我已经开始对它进行 docker 化。

但是,即使在我的 docker 容器内部运行登录工作流程时,我在尝试访问论坛的 api 时也会从容器内部收到 ECONNREFUSED 错误。上述api没有官方文档,所以很多都是自我调查。

我正在使用 axios v0.19.2 + strongcookie v4.0.0 运行 node v14.4.0 来处理请求。我能够从容器内部使用相同的有效负载成功地卷曲端点,所以我怀疑 axios/node.js 有什么东西让我头疼。我曾尝试查看 docker 和 ECONNREFUSED 的其他问题,但 stackoverflow 上的大多数问题都与容器间通信有关,而不是与外部 api/访问有关。

容器以 root 用户身份运行,我没有设置任何类型的代理或不稳定的网络。

有没有人有任何建议或暗示?我的 docker-compose 非常简单,但我已将其包含在下面以供参考。

version: '3.2'
services:
  bot:
    build: .
    env_file:
      - .env
    ports:
      - '80:80'

任何提示或理论将不胜感激;我已经完成了我的列表!

干杯!

【问题讨论】:

  • 您是否尝试过使用服务器启动命令前的sudo 命令来启动您的节点应用程序?...可能是您的应用程序无权运行您的实现中的功能 end -点
  • 我在容器内以 root 身份运行,并且使用sudo 显式运行我的构建和启动步骤仍然抛出ECONNREFUSED。 :(
  • port 命令反过来工作,它将容器上的一个端口暴露给主机。
  • 我正在公开那个端口,因为我也在围绕这个构建一个 API。 :) 您在下面关于使用主机网络的评论起到了作用!

标签: node.js docker docker-compose axios phpbb


【解决方案1】:

我假设您尝试从容器访问主机。实现这一点的一个简单方法是使用主机网络而不是容器网络。试试

version: '3.2'
services:
  network_mode: host
  bot:
    build: .
    env_file:
      - .env

更好的方法可能是将应用程序的其余部分也放入容器中并使用 Compose 中的服务发现,例如

version: '3.2'
services:
  bot:
    build: .
    env_file:
      - .env
  webapp:
    ...

那么就可以通过连接上例中的主机名“webapp”来访问PHP应用了。

【讨论】:

  • 添加network_mode: host 成功了。我以前在使用 docker 访问外部 API 时没有遇到过这种情况,所以知道这是件好事!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多