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

如何在Docker in Docker环境中连接SQL Server完成GitLab CI测试

GitLab CI流水线ASP.NET Core + MSSQL + Newman测试修复方案

核心问题根因

最早的配置中,GitLab CI声明的services服务运行在Runner宿主机网络,而通过DIND手动docker run启动的容器运行在Docker-in-Docker的独立网络中,两个网络不互通,因此应用无法连接MSSQL。后续更新的3阶段自定义网络方案本身方向正确,只需要调整几处配置即可。

具体修复步骤

  • 新增证书信任配置:EF Core 6+默认校验SQL Server的TLS证书,而CI环境中MSSQL用的是自签名证书,必须在连接字符串中添加TrustServerCertificate=True参数,完整连接字符串参考:
    "ConnectionStrings": {
      "CatalogDb": "Password=ppp;Persist Security Info=True;User ID=SA;Database=CatalogDb;Server=mcr.microsoft.com__mssql__server;TrustServerCertificate=True"
    }
    
    更稳妥的方式是启动应用容器时通过环境变量覆盖配置,避免修改源码:
    docker run --network network --name xxx1 -p 5535:5535 -e "ConnectionStrings__CatalogDb=Password=ppp;Persist Security Info=True;User ID=SA;Database=CatalogDb;Server=mcr.microsoft.com__mssql__server;TrustServerCertificate=True" -d $REGISTRY_URL/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
    
  • 优化MSSQL启动等待逻辑:硬等30秒无法保证MSSQL完全就绪,建议启动时添加健康检查,待数据库就绪后再启动应用:
    # 启动MSSQL时添加健康检查配置
    docker run --name mcr.microsoft.com__mssql__server --network network -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=ppp" --health-cmd="/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'ppp' -Q 'SELECT 1'" --health-interval=5s --health-retries=12 -d mcr.microsoft.com/mssql/server:2019-latest
    # 循环等待MSSQL健康状态正常
    until [ "`docker inspect -f {{.State.Health.Status}} mcr.microsoft.com__mssql__server`" == "healthy" ]; do
        sleep 2
    done
    
  • 修正应用启动方式:最早的测试阶段配置中docker run没有加-d参数,应用会前台运行阻塞后续的Newman测试步骤,必须添加-d让容器后台运行。
  • Newman测试地址调整:自定义网络中Newman容器访问应用的地址是应用容器的名称+端口,比如应用容器名为xxx1,端口为5535,Postman集合里的请求地址要改成http://xxx1:5535,不要用localhost。

内容的提问来源于stack exchange,提问作者Michele mpp Marostica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:24:03