Docker Compose部署SQL Server与ASP.NET连接失败求助
排查ASP.NET + SQL Server Docker Compose连接失败问题
以下是针对你遇到的连接问题的分步排查方案:
1. 修复Docker Compose的YAML缩进错误
你的docker-compose.yml中sqlserver服务的配置存在缩进错误,YAML对缩进要求严格,错误缩进会导致服务配置不生效。修正后的配置如下:
version: '3.4' services: web-site1: image: ${DOCKER_REGISTRY-}website1 build: context: . dockerfile: Web-site1/Dockerfile environment: CONNECTION_STRING: "Server=sqlserver;Database=Web-site2;User Id=sa;Password=191202G@v" ports: - "8080:8080" - "8081:8081" depends_on: - sqlserver sqlserver: image: mcr.microsoft.com/mssql/server:2022-latest ports: - "1433:1433" environment: ACCEPT_EULA: "Y" SA_PASSWORD: "191202G@v" volumes: - sqlserverdata:/var/opt/mssql/data - sqlserverlog:/var/opt/mssql/log volumes: sqlserverdata: driver: local driver_opts: o: bind type: none device: "F:/Progect/Web-site1/Web-site1/bin/Release/net8.0/publish/sqlserverdata" sqlserverlog: driver: local driver_opts: o: bind type: none device: "F:/Progect/Web-site1/Web-site1/bin/Release/net8.0/publish/sqlserverlog"
2. 处理SQL Server启动就绪延迟
depends_on仅保证容器启动顺序,不确保SQL Server完成初始化。ASP.NET应用启动时可能SQL Server还未就绪,导致连接失败。可以通过两种方式解决:
- 添加EF Core连接重试逻辑:
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"), options => options.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(10), errorNumbersToAdd: null)); - 配置Docker健康检查:
在sqlserver服务中添加健康检查:
修改sqlserver: # 其他配置... healthcheck: test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P '191202G@v' -Q 'SELECT 1' || exit 1"] interval: 10s timeout: 5s retries: 5web-site1服务的depends_on,等待SQL Server就绪:web-site1: # 其他配置... depends_on: sqlserver: condition: service_healthy
3. 确认连接字符串的优先级配置
你在docker-compose中设置了CONNECTION_STRING环境变量,但appsettings.json中硬编码了连接字符串。需要确保ASP.NET应用优先读取环境变量:
- 修改appsettings.json,让连接字符串读取环境变量:
"ConnectionStrings": { "DefaultConnection": "${CONNECTION_STRING}" } - 或者在Program.cs中显式优先读取环境变量:
var connectionString = Environment.GetEnvironmentVariable("CONNECTION_STRING") ?? builder.Configuration.GetConnectionString("DefaultConnection"); options.UseSqlServer(connectionString);
4. 检查SQL Server容器是否正常启动
执行以下命令查看SQL Server容器日志,确认服务状态:
docker logs <sqlserver-container-id>
重点检查:
- 是否出现密码不符合复杂度的报错(你的密码格式符合要求,但日志可验证)
- 是否有卷挂载权限错误,比如Windows路径是否被Docker Desktop正确访问
- 是否出现
SQL Server is now ready for client connections.的就绪提示
5. 验证容器网络连通性
进入web应用容器,测试与sqlserver服务的连通性:
# 测试ping连通性 docker exec -it <web-site1-container-id> ping sqlserver # 使用sqlcmd测试数据库连接 docker exec -it <web-site1-container-id> /opt/mssql-tools/bin/sqlcmd -S sqlserver -U sa -P '191202G@v' -Q 'SELECT DB_NAME()'
如果连接失败,根据报错信息进一步定位网络或认证问题。
内容的提问来源于stack exchange,提问作者Goga
相关产品推荐
相关产品推荐

