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
相关产品推荐
相关产品推荐

