Azure Pipeline中使用TestContainers连接SQL Server失败求助
问题:Azure Pipeline中TestContainers连接SQL Server容器失败
我用TestContainers编写集成测试,在IntegrationTestFactory.cs中按如下方式构建容器:
private readonly MsSqlContainer _dbContainer = new MsSqlBuilder() .Build();
本地运行完全正常,但部署到Azure Pipeline后出现连接失败错误:
错误信息: Microsoft.Data.SqlClient.SqlException : 建立与SQL Server的连接时发生了与网络相关的或特定于实例的错误。找不到服务器或无法访问服务器。请验证实例名称是否正确,并且SQL Server已配置为允许远程连接。(provider: TCP Provider, error: 35 - 捕获到内部异常) ---- System.Net.Sockets.SocketException : 资源暂时不可用
我尝试添加.WithImage("mcr.microsoft.com/mssql/server:2019-latest")指定镜像,但问题依旧。从日志来看容器已就绪:
[testcontainers.org 00:00:04.06] 在Docker容器e7255388023f执行 "/opt/mssql-tools/bin/sqlcmd -Q SELECT 1;" ##[debug]代理环境资源 - 磁盘: / 可用18225.00 MB,总74244.00 MB,内存: 使用2097.00 MB,总6921.00 MB,CPU: 使用率5.18% [testcontainers.org 00:00:10.27] Docker容器e7255388023f已就绪
我的Azure Pipeline配置如下:
trigger: - main pool: vmImage: 'ubuntu-22.04' variables: system.debug: true solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Debug' steps: - task: DotNetCoreCLI@2 displayName: '还原NuGet包' inputs: command: 'restore' projects: '$(solution)' - script: | echo "检查Docker安装情况..." docker --version displayName: '检查Docker安装' - script: | echo '拉取SQL Server Docker镜像...' docker pull mcr.microsoft.com/mssql/server:2019-latest displayName: '拉取SQL Server Docker镜像' - task: DotNetCoreCLI@2 displayName: '构建解决方案' inputs: command: 'build' projects: '$(solution)' arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 displayName: 测试 inputs: command: test projects: 'tests/*/*.csproj' publishTestResults: true arguments: '--configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura' # 先安装工具,再运行 - script: | dotnet tool install -g dotnet-reportgenerator-globaltool reportgenerator -reports:$(Agent.WorkFolder)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/CodeCoverage -reporttypes:'HtmlInline_AzurePipelines;Cobertura' displayName: 生成代码覆盖率报告 - task: PublishCodeCoverageResults@1 inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.cobertura.xml' reportDirectory: '$(System.DefaultWorkingDirectory)/**/coverage/' additionalCodeCoverageFiles: '$(System.DefaultWorkingDirectory)/**/coverage.json' - task: DotNetCoreCLI@2 displayName: '发布项目' inputs: command: 'publish' publishWebProjects: true arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)' zipAfterPublish: true - task: PublishBuildArtifacts@1 inputs: ArtifactName: 'drop' publishLocation: 'Container' PathtoPublish: $(Build.ArtifactStagingDirectory)
请问我遗漏了什么配置?
解决方案
针对Azure Pipeline中TestContainers连接SQL Server容器失败的问题,可尝试以下调整:
1. 增加SQL Server容器资源限制
Azure DevOps的Ubuntu代理默认资源可能不足以支撑SQL Server启动需求,尤其是内存。在构建容器时显式指定内存配额:
private readonly MsSqlContainer _dbContainer = new MsSqlBuilder() .WithImage("mcr.microsoft.com/mssql/server:2019-latest") .WithResourceRequest("memory", "2GB") .WithResourceLimit("memory", "2GB") .Build();
2. 显式配置端口绑定
代理环境中端口映射可能存在隐性问题,显式指定端口映射规则:
private readonly MsSqlContainer _dbContainer = new MsSqlBuilder() .WithImage("mcr.microsoft.com/mssql/server:2019-latest") .WithPortBinding(1433, true) // 自动映射宿主随机端口 .Build();
注意测试代码必须使用容器提供的连接字符串(_dbContainer.GetConnectionString()),禁止硬编码端口。
3. 延长容器就绪等待时间
日志显示容器就绪,但SQL Server内部服务可能未完全初始化,延长等待超时时间:
private readonly MsSqlContainer _dbContainer = new MsSqlBuilder() .WithImage("mcr.microsoft.com/mssql/server:2019-latest") .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("/opt/mssql-tools/bin/sqlcmd -Q 'SELECT 1'").WithTimeout(TimeSpan.FromMinutes(2))) .Build();
4. 更新TestContainers包版本
可能是版本兼容性问题,将Testcontainers.MsSql等相关NuGet包升级到最新稳定版。
内容的提问来源于stack exchange,提问作者Jepzen
相关产品推荐
相关产品推荐

