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

使用DotNet Testcontainers启动MailDev容器时抛出'Sequence contains more than one element'异常的排查求助

DotNet Testcontainers启动MailDev容器时抛出'Sequence contains more than one element'异常的排查求助

大家好,我最近在给公司的[MYAPP]项目编写UI自动化测试,需要用DotNet Testcontainers启动一个MailDev容器,用来拦截用户登录/密码重置场景下的发送邮件。但运行测试时一直卡在容器启动阶段,抛出了Sequence contains more than one element的异常,折腾了好一阵都没搞定,来向各位大佬求助!

错误日志详情

Error Log:
Standard Output Messages: [testcontainers.org 00:00:03.98] Reuse is an experimental feature.
warning: The previous ScenarioContext was already disposed.
Failed EmailAddressesAreValidatedByTheForgottenPasswordScreen("it uses unquoted backslashes",null) [26 ms]
Error Message: System.InvalidOperationException : Sequence contains more than one element
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.

Stack Trace:
at System.Linq.ThrowHelper.ThrowMoreThanOneElementException()
at System.Linq.Enumerable.TryGetSingle[TSource](IEnumerable`1 source, Boolean& found)
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at DotNet.Testcontainers.Containers.DockerContainer.UnsafeCreateAsync(CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 441
at DotNet.Testcontainers.Containers.DockerContainer.StartAsync(CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 306
at [MYCOMPANY].[MYAPP].UI.Tests.Hooks.ConfigurationHooks.SetConfiguration(IObjectContainer objectContainer) in /home/runner/actions-runner/_work/[MYAPP]/[MYAPP]/Tests/[MYCOMPANY].[MYAPP].UI.Tests/Hooks/ConfigurationHooks.cs:line 48
...(后续调用栈省略)

从栈信息看,异常是在DockerContainer.UnsafeCreateAsync方法里调用SingleOrDefault时触发的——因为查询到的序列存在多个元素,不符合该方法的预期。

我的容器创建代码

这是我在ConfigurationHooks里创建MailDev容器的核心代码片段:

[BeforeFeature(Order = TestRunSequence.RegisterObjectContainer)]
public static async Task SetConfiguration(IObjectContainer objectContainer)
{
    var configuration = new ConfigurationBuilder()
        .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddEnvironmentVariables() // 加载环境变量
        .AddUserSecrets<IdentityProviderConfiguration>()
        .Build();

    objectContainer?.RegisterInstanceAs(configuration);

    var mailDevContainer= new ContainerBuilder()
        .WithImage("maildev/maildev:latest")
        .WithPortBinding(1080, true)
        .WithPortBinding(1025, true)
        .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(1080))
        .WithReuse(true)
        .WithLabel("maildev-container", "MailDev")
        .WithPortBinding(1080, 1080)
        .WithPortBinding(1025, 1025)
        .Build();

    // 后续启动容器的逻辑...
}

我的疑惑点

  1. 我注意到代码里重复调用了WithPortBinding:先是WithPortBinding(1080, true)和WithPortBinding(1025, true),后来又加了WithPortBinding(1080, 1080)和WithPortBinding(1025, 1025),会不会是重复绑定端口导致Testcontainers查询容器时出现多个匹配项?
  2. 我开启了容器复用功能(WithReuse(true)),这个特性是实验性的,会不会是复用逻辑在查找现有容器时返回了多个结果,导致SingleOrDefault调用失败?
  3. 有没有可能是Docker环境本身的问题,比如之前的MailDev容器没有正确清理,导致存在多个同标签/同端口的容器?

有没有遇到过类似问题的朋友?或者能帮我排查下代码里的问题,给个解决方向?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:44:34