【问题标题】:github workflow: "ECONNREFUSED 127.0.0.1:***" error when connecting to docker containergithub工作流程:连接到docker容器时出现“ECONNREFUSED 127.0.0.1:***”错误
【发布时间】:2020-06-21 22:07:01
【问题描述】:

在我的 github 操作工作流程中,我在运行我的 jest 测试脚本时收到此错误 (ECONNREFUSED)。该测试使用 axios 连接到我的 api,该 api 在通过 docker-compose 引导的容器中运行(在 github 工作流程本身期间创建)。该网络只有 2 个容器:api 和 postgres。因此,我假设我的测试脚本位于“主机网络”(github 工作流程)上,但它无法通过容器的映射端口到达 docker 网络。

  • 然后我完全跳过了开玩笑测试,只是尝试直接 ping 容器。没用。
  • 然后我修改了工作流程以检查应该已创建的默认 docker 网络:

更新 1

我已将问题范围缩小如下。当我修改撰写文件以依赖默认网络时(我的撰写文件中不再有networks:):

所以看起来容器从未连接到默认桥接网络。

更新 2

看起来我只是有错误的范例。读完后:https://help.github.com/en/actions/configuring-and-managing-workflows/about-service-containers 我意识到这根本不是 GA 期望我们实例化容器的方式。看起来我应该在工作流文件中使用 services: 节点,而不是使用我自己的 docker-compose 文件中的容器。 ???试试看……

【问题讨论】:

    标签: docker github docker-compose github-actions


    【解决方案1】:

    所以答案是:

    1. 请勿使用 docker-compose 构建您自己的自定义容器。 GA 尚不支持此功能。
    2. 在您的工作流 .yml 文件中使用 services: 来启动您的容器,这些容器必须是公共 docker 镜像。如果您的容器基于私有映像或自定义 dockerfile,则 GA 尚不支持。

    因此,我不得不:

    1. 在我的 github 工作流 .yml 中创建 postgres as a service container
    2. 将 package.json 中的测试命令更改为:
      • 首先将 api 作为后台进程启动(因为我无法从中创建自己的 docker 映像?)然后
      • 接下来调用我的测试框架(作为前台进程)

    所以npm run start & npm run <test launch cmds>。这行得通。

    【讨论】:

    • 不幸的是,使用 GA 的“服务”而不是现有的 docker-compose 逻辑会强制重复现有的逻辑。
    【解决方案2】:

    这里有几种可能性。

    主机网络

    由于您使用的是 docker compose,所以当您启动 api 容器时,将 api 正在侦听的端点发布到主机。你可以这样做:

    version: 3
    services:
      api:
        ...
        ports:
          - "3010:3010"
    

    在您的docker-compose.yml 中。这将发布端口,类似于docker run ... ---publish localhost:3010:3010。参考这里:https://docs.docker.com/compose/compose-file/#ports

    组成网络

    默认情况下,docker-compose 会创建一个名为backend-net_default 的网络。此docker-compose.yml 创建的容器将可以通过此网络访问其他容器。访问网络上其他容器的主机名就是服务的名称。例如,您的测试可以使用主机 api(假设这是您的 api 服务的名称)访问 api 端点,例如:

    http://api:3010
    

    这里需要注意的是,测试必须在由同一 docker-compose.yml 管理的容器中启动,以便它可以访问公共 backend-net_default 网络。

    【讨论】:

    • +zr0gravity - “您的测试可以使用主机 api 访问 api 端点” - 不,因为测试是主要 github 工作流程的一部分。他们没有码头化。他们只是调用创建的 docker 容器。不过,我会尝试您的 localhost:port:port 想法 - 我以前从未见过这种结构。
    • UPDATE 这些不是有效的结构。但是感谢您的一些建议!
    • 我的错误,请参阅编辑。 (localhost:port:port 应该是"port:port"
    • 好的,但我的问题不是“容器如何相互到达”......而是“我如何才能到达容器”。
    • 我明白这一点。我在 docker compose 文件中使用了ports:;我明白这是如何工作的。我知道如何从主机访问容器。让它在本地工作。不适用于 Github 工作流程。我无法调试原因,因为 github 混淆了我将用于调试的所有信息,因为我的端口、主机名等是项目“秘密”。我将尝试对值进行硬编码,以便了解发生了什么。如果这是一个糟糕的 docker 设置(即我的错误),我将删除这个问题。如果不是,我会回来报告。
    猜你喜欢
    • 1970-01-01
    • 2022-06-28
    • 2020-05-04
    • 2017-08-11
    • 1970-01-01
    • 2022-12-21
    • 2020-03-19
    • 2019-05-03
    • 2022-08-21
    相关资源
    最近更新 更多