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

