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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:47:26