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

