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

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: 5
    
    修改web-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:55:01