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

GitHub Actions中MSSQL资源暂不可用导致.NET测试失败问题

解决GitHub Actions中MSSQL容器与.NET测试的连接问题

针对你遇到的System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Resource temporarily unavailable错误,以下是几个可行的解决方向:

1. 用服务名替代localhost访问数据库

GitHub Actions的services定义的容器,在job内部可以直接通过服务名(这里是sqlserver)访问,不需要用localhost或者容器ID。之前的测试步骤未指定服务器地址,默认用localhost的方式在runner网络环境中并不正确,改用服务名才能直接连通容器内的MSSQL服务。

在Test步骤的环境变量里添加DATABASE_SERVER: sqlserver,并确保测试代码的连接字符串使用这个变量作为服务器地址。

2. 等待MSSQL服务完全就绪

容器显示运行状态不代表内部SQL服务已经准备好接受连接。需要在创建数据库前添加等待逻辑,确认服务真正就绪:

- name: 等待MSSQL服务就绪
  run: |
    until docker exec $DATABASE_SERVER /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'redacted' -Q 'SELECT 1' > /dev/null 2>&1; do
      echo "等待MSSQL启动..."
      sleep 5
    done

把这个步骤放在create database步骤之前,避免在服务未初始化完成时执行数据库操作。

3. 优化容器ID的获取逻辑

之前用docker ps --all --filter status=running获取容器ID可能会拿到多个无关容器,导致后续命令出错。可以添加镜像过滤,精准定位MSSQL容器:

- name: 获取容器ID
  run: echo "DATABASE_SERVER=$(docker ps --filter status=running --filter ancestor=mcr.microsoft.com/mssql/server:2022-latest --format "{{.ID}}")" >> $GITHUB_ENV

4. 检查SA密码复杂度

MSSQL对SA密码有强制复杂度要求(至少8位,包含大小写字母、数字、特殊字符),如果密码不符合要求,服务可能未完成初始化。确保你的SA_PASSWORD满足复杂度规则。

修改后的完整工作流示例

name: .NET Backend Build and run Unit Tests

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  build_and_test:
    runs-on: ubuntu-latest

    services:
      sqlserver:
        image: mcr.microsoft.com/mssql/server:2022-latest
        ports:
          - 1433:1433
        env:
          ACCEPT_EULA: "Y"
          SA_PASSWORD: "YourStrong!Passw0rd" # 替换为符合要求的密码
          MSSQL_PID: "Express"
          MSSQL_COLLATION: "SQL_Latin1_General_CP1_CI_AS"

    steps:
    - name: 获取容器ID
      run: echo "DATABASE_SERVER=$(docker ps --filter status=running --filter ancestor=mcr.microsoft.com/mssql/server:2022-latest --format "{{.ID}}")" >> $GITHUB_ENV

    - name: 等待MSSQL服务就绪
      run: |
        until docker exec $DATABASE_SERVER /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong!Passw0rd' -Q 'SELECT 1' > /dev/null 2>&1; do
          echo "等待MSSQL启动..."
          sleep 5
        done

    - name: 创建数据库
      run: docker exec $DATABASE_SERVER /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE dbname'

    - uses: actions/checkout@v3

    - name: 配置.NET环境
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: 6.0.x

    - name: 还原依赖
      run: dotnet restore

    - name: 构建项目
      run: dotnet build --no-restore

    - name: 运行测试
      env:
        DATABASE_SERVER: sqlserver
        DATABASE_PORT: 1433
        DATABASE_NAME: dbname
        DATABASE_USER: sa
        DATABASE_PASSWORD: YourStrong!Passw0rd
      run: dotnet test --no-build --verbosity normal

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:10:19