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

Testcontainers C#中MsSql容器启动报错:端口未映射异常求助

问题分析与解决方案

核心原因

你遇到的异常是因为固定绑定主机1433端口导致端口冲突,或者容器未完全启动就访问Port属性。几天前正常是因为当时主机1433端口未被占用,现在可能被本地SQL Server服务、其他容器或进程占用,导致Testcontainer无法绑定端口启动,访问Port属性时触发InvalidOperationException。

解决方案

1. 改用随机端口映射(推荐)

Testcontainers推荐使用随机端口映射,避免端口冲突,框架会自动处理端口映射,你可以通过内置方法获取正确的连接信息:

修改后的代码:

private readonly MsSqlTestcontainer _msSqlTestcontainer;

public DbSessionConnectionFactory()
{
    _msSqlTestcontainer = new TestcontainersBuilder<MsSqlTestcontainer>()
        .WithImage("mcr.microsoft.com/mssql/server:2022-latest")
        // 移除固定端口绑定,让容器自动分配随机端口
        // .WithPortBinding(1433, 1433)
        .WithEnvironment("ACCEPT_EULA", "Y")
        .WithEnvironment("SA_PASSWORD", "Admin_12345")
        .Build();
}

public async Task InitializeAsync()
{
    await _msSqlTestcontainer.StartAsync();
    
    // 直接获取完整的连接字符串(自动包含映射后的端口和容器地址)
    var connectionString = _msSqlTestcontainer.GetConnectionString();
    
    // 若需手动获取映射端口,可使用:
    // var mappedPort = _msSqlTestcontainer.GetMappedPublicPort(1433);
}

2. 释放主机1433端口(若坚持用固定端口)

如果必须绑定主机1433端口,先排查并释放被占用的端口:

  • Windows:打开命令提示符执行netstat -ano | findstr :1433,找到进程ID(最后一列数字),打开任务管理器结束对应进程。
  • Linux/macOS:执行lsof -i :1433找到进程PID,执行kill -9 [PID]终止进程。

3. 更新Testcontainers包

确保Testcontainers.MsSql NuGet包是最新版本,旧版本可能存在端口处理的bug,更新后可解决部分兼容性问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:55:15