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
相关产品推荐
相关产品推荐

