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

在SQL Server Linux容器中使用Powershell Core初始化数据库连接报错如何解决

问题根因

官方mcr.microsoft.com/mssql/server镜像的默认启动逻辑是运行SQL Server主进程/opt/mssql/bin/sqlservr,你在Dockerfile中重写了CMD指令,直接执行PowerShell初始化脚本,未启动SQL Server进程,所以所有数据库连接请求都会报错。

检测SQL Server实例是否启动的方法
  • 检查进程状态:在容器内执行ps aux | grep sqlservr,如果无匹配的运行进程,说明SQL Server未启动
  • 检查端口监听:SQL Server默认监听1433端口,执行ss -tuln | grep 1433,无返回结果则说明服务未启动完成
  • 本地连接测试:用镜像自带的sqlcmd工具执行/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P <你的sa密码>,能正常进入交互终端则服务运行正常,否则未完成启动
手动启动SQL Server的方法

容器内手动执行以下命令即可启动SQL Server,注意该进程必须保持前台运行,否则容器会自动退出:

/opt/mssql/bin/sqlservr
修正后的容器初始化方案

不需要修改Dockerfile,仅调整Initialize-Database.ps1逻辑,实现「启动SQL Server→等待服务就绪→执行初始化→保持进程运行」的完整流程:

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Install-Module SQLServer -Confirm:$false

# 后台启动SQL Server主进程
Start-Process -NoNewWindow -FilePath /opt/mssql/bin/sqlservr

# 循环等待服务就绪
$started = $false
while (-not $started) {
    Start-Sleep -Seconds 3
    Write-Verbose "等待SQL Server启动..."
    try {
        # 测试数据库连接
        Invoke-SqlCmd -Query "SELECT 1" -ServerInstance "." -Username "sa" -Password $sa_password -ErrorAction Stop
        $started = $true
    } catch {
        $started = $false
    }
}

# 执行自定义初始化逻辑
if ($sa_password -ne "_") {
    Write-Verbose "创建业务数据库my-db"
    # 带特殊符号的数据库名需要用方括号包裹
    $sqlcmd = "CREATE DATABASE [my-db]"
    Invoke-SqlCmd -Query $sqlcmd -ServerInstance "." -Username "sa" -Password $sa_password
}

# 等待SQL Server进程结束,避免容器退出
Wait-Process -Name sqlservr

额外注意事项

  • 执行Invoke-SqlCmd时必须显式传入sa账号和密码,未配置身份验证信息默认会用当前系统用户的Windows身份验证,Linux环境下该验证方式不生效
  • 初始化完成后必须挂起脚本等待SQL Server进程,否则脚本执行完成后容器会直接退出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:15:03