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

.NET测试通过Docker命令运行正常,Docker Compose运行报错求助

.NET测试容器化(Docker Compose)报错排查与解决

问题描述

我在.NET测试中通过Docker编写测试用例,测试前会拉取RabbitMQ镜像并启动,本地运行正常。尝试将测试容器化,通过挂载/var/run/docker.sock实现容器内调用Docker主机命令:

  • 使用docker run -v /var/run/docker.sock:/var/run/docker.sock -ti rabbitmq-dotnet-app-tests运行测试正常
  • 但用Docker Compose运行时出现错误,错误日志如下:
rabbitmq-dotnet-app-tests-1  |   Failed tests.DummyTests.RabbitMqTest1.test1 [1 ms]
rabbitmq-dotnet-app-tests-1  |   Error Message:
rabbitmq-dotnet-app-tests-1  |    System.AggregateException : One or more errors occurred. (One or more errors occurred. (Initialization has been cancelled.)) (The following constructor parameters did not have matching fixture data: RabbitMqFixture rabbitMqFixture)
rabbitmq-dotnet-app-tests-1  | ---- System.AggregateException : One or more errors occurred. (Initialization has been cancelled.)
rabbitmq-dotnet-app-tests-1  | -------- DotNet.Testcontainers.Containers.ResourceReaperException : Initialization has been cancelled. rabbitmq-dotnet-app-tests-1  | ---- The following constructor parameters did not have matching fixture data: RabbitMqFixture rabbitMqFixture

当前Docker Compose配置文件:

version: "3.8"

services:
  app-tests:
    image: rabbitmq-dotnet-app-tests
    build:
      context: .
      dockerfile: Dockerfile.Tests
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

环境:Windows版Docker Desktop,测试连接字符串为amqp://guest:guest@host.docker.internal:5672/

解决方法

1. 修正Testcontainers资源回收器配置

Docker Compose运行时,Testcontainers的ResourceReaper可能因网络环境识别失败导致初始化取消,可通过两种方式处理:

  • 禁用ResourceReaper(仅适合测试场景):
TestcontainersSettings.ResourceReaperEnabled = false;
  • 显式指定Compose网络(默认网络名为项目目录名_default):
var rabbitMqContainer = new RabbitMqBuilder()
    .WithNetwork("your-project-dir-name_default")
    .Build();

2. 提升容器权限

Windows下挂载docker.sock可能存在权限问题,在Compose配置中添加权限相关设置:

version: "3.8"

services:
  app-tests:
    image: rabbitmq-dotnet-app-tests
    build:
      context: .
      dockerfile: Dockerfile.Tests
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    privileged: true
    user: root

3. 指定Windows Docker主机地址

在测试代码中显式配置Docker主机端点,适配Windows环境:

TestcontainersSettings.OS = TestcontainersOperatingSystem.Windows;
TestcontainersSettings.DockerEndpointAuthConfig = new DockerEndpointAuthConfig
{
    Address = "npipe:////./pipe/docker_engine"
};

4. 检查Fixture依赖注入配置

针对RabbitMqFixture无匹配数据的错误:

  • 确保测试类继承IClassFixture<RabbitMqFixture>或ICollectionFixture<RabbitMqFixture>
  • 验证RabbitMqFixture的初始化逻辑无异常,测试类构造函数正确接收Fixture实例

5. 统一测试网络

创建专属Compose网络,让测试容器与Testcontainers创建的RabbitMQ容器处于同一网络:

version: "3.8"

networks:
  test-network:
    name: test-network
    driver: bridge

services:
  app-tests:
    image: rabbitmq-dotnet-app-tests
    build:
      context: .
      dockerfile: Dockerfile.Tests
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - test-network

同时在测试代码中指定RabbitMQ容器使用该网络:

var rabbitMqContainer = new RabbitMqBuilder()
    .WithNetwork("test-network")
    .Build();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:40:44