github工作流程:连接到Docker容器时出现“ ECONNREFUSED 127.0.0.1:***”错误

时间:2020-06-21 22:07:01

标签: docker github docker-compose github-actions

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

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

更新1

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

Screenshot of network description

因此,似乎容器从未连接到默认桥网络。

更新2

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

2 个答案:

答案 0 :(得分:0)

所以答案是:

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

因此,我不必“ docker-compose up”来引导postgres +我的api以进行集成测试,而是:

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

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

答案 1 :(得分:-1)

这里有几种可能性。

主机网络

由于使用的是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网络。