Testcontainers.net自定义容器与SQL Server容器通信故障排查
解决容器间SQL Server连接问题
问题原因
你怀疑的没错:GetConnectionString() 返回的是主机访问容器的地址(127.0.0.1 + 映射端口),但同一Docker网络内的容器需要通过容器名称和容器本身的端口(而非主机映射端口)通信。
解决方案步骤
1. 给SQL Server容器指定固定名称
在创建SQL容器时,添加WithName()方法设置可识别的容器名称,让自定义容器能通过该名称访问它:
_dbContainer = new MsSqlBuilder() .WithImage("mcr.microsoft.com/mssql/server:2022-latest") .WithPassword("Redacted") .WithNetwork(_network) .WithName("sql-server-container") // 指定容器名称 .Build();
2. 构建容器间专用连接字符串
放弃使用GetConnectionString(),手动构建连接字符串:用SQL容器名称作为服务器地址,端口用默认的1433(容器内SQL服务原生运行端口,同一网络内可直接访问):
var interContainerConnString = $"Server=sql-server-container,1433;Database=master;User Id=sa;Password=Redacted;TrustServerCertificate=True;";
3. 传入新连接字符串到自定义容器
将上述连接字符串作为环境变量传给自定义容器:
ContainerInstance = new ContainerBuilder() .WithImage(_dockerImage) .WithEnvironment("Database", interContainerConnString) .WithNetwork(_network) // 确保自定义容器加入同一网络 .Build();
额外注意事项
- 确保自定义容器已加入目标Docker网络(你已通过
WithNetwork(_network)配置,无需修改)。 - SQL Server容器启动需要时间,建议在启动自定义容器前等待SQL容器就绪:
await _dbContainer.WaitForContainerReadyAsync();
内容的提问来源于stack exchange,提问作者UncountedBrute
相关产品推荐
相关产品推荐

