You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitHub Actions中无法访问host.docker.internal的解决方法咨询

解决GitHub Actions中TestContainers无法使用host.docker.internal的问题

核心问题是你当前方案依赖主机端口映射和host.docker.internal,但GitHub Actions的Docker环境不支持这种方式。正确的思路是让所有容器加入自定义Docker网络,通过容器别名直接通信,完全绕过主机IP的依赖。

步骤1:创建自定义测试网络

在你的测试Fixture中初始化专属网络,让所有测试容器都加入这个网络:

private INetwork _testNetwork;

public async Task InitializeAsync()
{
    // 创建自定义网络,名称可自定义
    _testNetwork = new NetworkBuilder()
        .WithName("test-integration-network")
        .Build();
    await _testNetwork.CreateAsync();
}

步骤2:修改PostgreSQL和RabbitMQ容器的启动逻辑

给这两个容器添加网络别名,让PostService容器可以通过别名直接访问它们,无需映射端口到主机:

PostgreSQL容器示例

public async Task<IContainer> StartPostgresContainerAsync()
{
    var postgresContainer = new PostgresBuilder()
        .WithImage("postgres:latest")
        .WithEnvironment("POSTGRES_PASSWORD", "postgres")
        .WithNetwork(_testNetwork) // 加入自定义网络
        .WithNetworkAliases("postgres-service") // 设置访问别名
        .Build();

    await postgresContainer.StartAsync();
    _containers["postgres"] = postgresContainer;
    return postgresContainer;
}

RabbitMQ容器示例

public async Task<IContainer> StartRabbitMQContainerAsync()
{
    var rabbitmqContainer = new RabbitMQBuilder()
        .WithImage("rabbitmq:3-management")
        .WithNetwork(_testNetwork)
        .WithNetworkAliases("rabbitmq-service")
        .Build();

    await rabbitmqContainer.StartAsync();
    _containers["rabbitmq"] = rabbitmqContainer;
    return rabbitmqContainer;
}

步骤3:修改PostService容器的配置

去掉host.docker.internal和主机映射端口的依赖,直接用容器别名和内部端口(如PostgreSQL的5432、RabbitMQ的5672):

public async Task<IContainer> StartPostServiceContainerAsync(IContainer postgresContainer,
    IContainer rabbitmqContainer)
{
    var container = new ContainerBuilder()
        .WithImage("mydockerhubname/postservice:latest")
        .WithPortBinding(8080, true) // 保留此配置,因为测试需要从主机访问PostService
        .WithEnvironment("ConnectionStrings__PostsConn",
            "Server=postgres-service;Port=5432;Database=postgres;User Id=postgres;Password=postgres;")
        .WithEnvironment("RabbitMQHost", "rabbitmq-service")
        .WithEnvironment("RabbitMQPort", "5672")
        .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(8080))
        .WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged("Now listening on"))
        .WithNetwork(_testNetwork) // 加入同一网络
        .DependsOn(postgresContainer)
        .DependsOn(rabbitmqContainer)
        .Build();

    await container.StartAsync();
    _containers["postservice"] = container;
    return container;
}

方案优势

  • 自定义网络内的容器通过别名直接通信,不依赖主机IP或host.docker.internal,适配所有CI环境(包括GitHub Actions)。
  • 无需映射PostgreSQL和RabbitMQ的端口到主机,避免端口冲突,更符合容器化通信原则。
  • 测试代码访问PostService的逻辑无需修改,因为测试在GitHub Actions的runner主机上运行,仍需访问容器的映射端口8080。

内容的提问来源于stack exchange,提问作者Vercors

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:47:20