Azure Pipeline中Docker容器间SQL Server连接失败排查求助
Azure Pipeline中Docker Compose连接SQL Server失败的解决方案
1. 修正连接字符串
- 别用
localhost,换成Docker Compose里SQL容器的服务名——容器内部靠服务名通信,Azure Pipeline里的localhost指的是代理主机,不是SQL容器。示例连接字符串:Server=mssql,1433;Database=YourDb;User Id=sa;Password=YourStrongPass;TrustServerCertificate=True; - 必须加
TrustServerCertificate=True,避开Azure环境下的SSL证书验证坑。
2. 调整SQL Server容器配置
- 在
docker-compose.yml里给SQL容器加固定端口映射,同时配置正确的环境变量和健康检查:services: mssql: image: mcr.microsoft.com/mssql/server:2022-latest environment: - ACCEPT_EULA=Y - SA_PASSWORD=YourStrong!Passw0rd ports: - "1433:1433" healthcheck: test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P YourStrong!Passw0rd -Q 'SELECT 1' || exit 1"] interval: 10s timeout: 5s retries: 5 - 健康检查必须加,不然容器启动了但SQL服务还没就绪,EF迁移和SchemaSpy一连接就失败。
3. Azure Pipeline里的Docker Compose执行步骤
- 启动容器后,必须等SQL服务完全就绪再执行后续操作,用脚本循环检查:
docker-compose up -d # 循环等待SQL服务可用 docker-compose exec -T mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P YourStrong!Passw0rd -Q 'SELECT 1' until [ $? -eq 0 ]; do sleep 5 docker-compose exec -T mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P YourStrong!Passw0rd -Q 'SELECT 1' done - 确认Pipeline用的Docker Compose版本和本地一致,避免版本兼容问题。
4. EF迁移的正确执行方式
- 别在本地构建的镜像里跑迁移,直接在Pipeline里用.NET SDK任务连接Docker里的SQL服务执行:
dotnet ef database update --connection "Server=mssql,1433;Database=YourDb;User Id=sa;Password=YourStrong!Passw0rd;TrustServerCertificate=True;" - 确保Pipeline环境里装了EF工具。
5. SchemaSpy容器的连接配置
- 同样用SQL容器的服务名当主机,并且依赖SQL服务的健康状态:
schemaspy: image: schemaspy/schemaspy:latest depends_on: mssql: condition: service_healthy volumes: - ./docs:/output command: -t mssql -host mssql -port 1433 -db YourDb -u sa -p YourStrong!Passw0rd -o /output -s dbo -trustServerCert true - 用
depends_on配合service_healthy,保证SchemaSpy只在SQL服务就绪后启动。
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

