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

.NET应用无法连接Docker中运行的SQL Server问题求助

.NET应用连接Docker Compose中SQL Server失败的解决办法

先针对你的配置和问题,给出具体的排查修复步骤:

1. 清理Docker Compose冗余配置并添加SQL Server健康检查

你的docker-compose.yml里存在重复的producttest2git服务,且depends_on仅保证容器启动顺序,不确保SQL Server完全就绪。修正后的配置如下:

version: '3.4'

services:
  SqlServerDb:
    container_name: SqlServerContainer
    image: mcr.microsoft.com/mssql/server:2019-latest
    ports:
      - 8002:1433
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_SA_PASSWORD=Admin0147
    networks:
      - myAppNetwork
    # 新增健康检查,确保SQL Server初始化完成后再启动WebApi
    healthcheck:
      test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Admin0147 -Q 'SELECT 1' || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 5

  WebApi:
    container_name: producttest2gitcontainer
    ports:
      - 8001:80 
    build:
      context: .
      dockerfile: ProductTest2Git/Dockerfile
    depends_on:
      SqlServerDb:
        condition: service_healthy # 等待SQL Server健康检查通过
    networks:
      - myAppNetwork

networks:
  myAppNetwork:

2. 优化连接字符串稳定性

你的连接字符串格式基本正确,但补充几个关键参数避免证书和超时问题:

"ConnectionStrings": {
    "DefaultConnection": "Server=SqlServerDb,1433;Database=ProjectTestGit2;User Id=sa;Password=Admin0147;TrustServerCertificate=True;Connect Timeout=30;"
}
  • TrustServerCertificate=True:跳过Docker中SQL Server自签证书的验证(测试环境可用,生产建议配置可信证书)
  • Connect Timeout=30:延长连接等待时间,适配SQL Server初始化延迟
  • 显式指定1433端口,避免网络解析歧义

3. 给.NET应用添加连接重试逻辑

即使有健康检查,仍可能出现时序问题,在EF Core中配置自动重试:

// Program.cs中配置DbContext时
builder.Services.AddDbContext<YourDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"),
        sqlOptions => sqlOptions.EnableRetryOnFailure(
            maxRetryCount: 5,
            maxRetryDelay: TimeSpan.FromSeconds(10),
            errorNumbersToAdd: null)));

4. 验证配置文件是否正确复制

检查你的Dockerfile,确保appsettings.json被正确复制到容器的发布目录:

# 示例Dockerfile末尾部分
WORKDIR /app
COPY --from=publish /app/publish .

最终验证步骤

  1. 停止所有容器:docker-compose down
  2. 重新构建启动:docker-compose up --build
  3. 查看WebApi日志:docker logs producttest2gitcontainer,确认连接状态
  4. 若仍有问题,进入WebApi容器测试:docker exec -it producttest2gitcontainer bash,用dotnet ef命令直接测试数据库连接

内容的提问来源于stack exchange,提问作者ha33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:02