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

Testcontainers 3.2.0 MsSqlBuilder无法配置端口、用户名和数据库名

解决MsSqlContainer自定义端口、用户名和数据库名的问题

针对你的需求,以下是调整后的代码及关键说明,解决三个配置问题:

1. 自定义用户名与数据库名

MsSqlBuilder内置了WithUsername()和WithDatabase()方法,直接调用即可覆盖默认的sa用户名与master数据库。

2. 端口绑定问题

你当前的端口绑定写法有误,正确方式是明确指定主机端口与**容器内部端口(MsSql默认1433)**的映射关系。另外默认GetConnectionString()会使用Testcontainers自动分配的随机端口,若需固定端口,建议手动构造连接字符串。

修改后的完整代码

public class ApiFactory<TEntryPoint> : WebApplicationFactory<TEntryPoint> where TEntryPoint : class
{
    private readonly MsSqlContainer msSqlContainer = new MsSqlBuilder()
        .WithHostname("mytestdb")
        .WithUsername("customUser") // 设置自定义用户名
        .WithPassword("MyTestPassword$$123")
        .WithDatabase("customDb") // 设置自定义数据库名
        .WithPortBinding(25555, MsSqlBuilder.MsSqlPort) // 绑定主机25555端口到容器1433端口
        .WithName("testcontainer")
        .Build();

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        try
        {
            this.msSqlContainer.StartAsync().Wait();
            
            // 手动构造使用固定端口的连接字符串
            var customConnectionString = $"Server=127.0.0.1,25555;Database={msSqlContainer.DatabaseName};UserId={msSqlContainer.Username};Password={msSqlContainer.Password};TrustServerCertificate=True";
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
        finally
        {
            this.msSqlContainer.StopAsync().Wait();
        }
    }
}

关键补充说明

  • 若需要容器启动时自动创建自定义数据库,可添加WithInitScript("init.sql")方法,指定包含CREATE DATABASE customDb;语句的初始化脚本文件。
  • 若不想手动构造连接字符串,可通过msSqlContainer.GetMappedPort(MsSqlBuilder.MsSqlPort)获取绑定后的主机端口,再拼接进连接字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:34:56