如何通过PowerShell将.bacpac文件导入Docker中的SQL Server实例?
解决方案:跨平台PowerShell脚本导入bacpac到Docker SQL Server及Azure SQL
核心背景
你的项目需要:
- 用
*.bacpac作为统一备份格式(适配Azure SQL不支持*.bak的限制) - 跨平台PowerShell脚本,同时支持导入到Azure SQL和Docker部署的SQL Server(
mcr.microsoft.com/mssql/server:2022-latest) - 避免手动操作,完全脚本化集成
方案1:主机安装跨平台sqlpackage(推荐,简单直接)
微软提供跨平台的sqlpackage工具,支持Windows/macOS/Linux,直接在主机上安装后用PowerShell调用即可。
安装步骤
- Windows:下载安装SQL Server Data Tools (SSDT) 或sqlpackage独立安装包
- macOS:
brew install microsoft-sqlpackage - Linux:根据发行版选择apt/yum安装,或下载二进制包解压到PATH目录
PowerShell脚本示例
# 配置参数 $bacpacFilePath = "./test-dataset.bacpac" $targetType = "Docker" # 可选:Docker/Azure $dockerServer = "localhost,1433" $azureServer = "your-sql-server.database.windows.net" $databaseName = "TestDB" $saPassword = "YourStrong!Passw0rd" $azureAdminUser = "azure-admin" $azureAdminPass = "AzureStrong!Passw0rd" # 导入到Docker SQL Server if ($targetType -eq "Docker") { sqlpackage ` /Action:Import ` /SourceFile:$bacpacFilePath ` /TargetServerName:$dockerServer ` /TargetDatabaseName:$databaseName ` /TargetUser:sa ` /TargetPassword:$saPassword } # 导入到Azure SQL Database(保留原有逻辑) if ($targetType -eq "Azure") { New-AzSqlDatabaseImport ` -ResourceGroupName "your-resource-group" ` -ServerName $azureServer ` -DatabaseName $databaseName ` -StorageKeyType "StorageAccessKey" ` -StorageKey "your-storage-account-key" ` -StorageUri "https://your-storage.blob.core.windows.net/backups/test-dataset.bacpac" ` -Edition "GeneralPurpose" ` -ServiceObjectiveName "GP_Gen5_2" ` -AdministratorLogin $azureAdminUser ` -AdministratorLoginPassword (ConvertTo-SecureString $azureAdminPass -AsPlainText -Force) }
方案2:临时容器运行sqlpackage(无需主机安装软件)
如果不想在开发者主机上安装额外工具,可以用临时Docker容器运行sqlpackage,通过挂载文件和共享网络完成导入。
PowerShell脚本示例
# 参数配置 $bacpacPath = (Resolve-Path "./test-dataset.bacpac").Path # 转换为绝对路径,适配跨平台 $sqlContainerName = "sql-dev-container" # 你的SQL Server容器名称 $databaseName = "TestDB" $saPassword = "YourStrong!Passw0rd" # 检查SQL Server容器是否就绪 $isReady = $false while (-not $isReady) { try { docker exec $sqlContainerName /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $saPassword -Q "SELECT 1" | Out-Null $isReady = $true } catch { Write-Host "等待SQL Server容器就绪..." Start-Sleep -Seconds 5 } } # 启动临时dotnet容器,执行sqlpackage导入 docker run --rm ` --network container:$sqlContainerName ` # 共享SQL容器网络,直接用localhost连接 -v "$bacpacPath:/tmp/test-dataset.bacpac" ` # 挂载bacpac文件到容器内 mcr.microsoft.com/dotnet/sdk:7.0 ` bash -c " dotnet tool install --global microsoft.sqlpackage export PATH=`$PATH:`$HOME/.dotnet/tools sqlpackage \ /Action:Import \ /SourceFile:/tmp/test-dataset.bacpac \ /TargetServerName:localhost \ /TargetDatabaseName:$databaseName \ /TargetUser:sa \ /TargetPassword:$saPassword "
方案3:自定义SQL Server镜像(团队统一环境)
如果团队需要长期复用,可以基于官方镜像构建预装sqlpackage的自定义镜像,避免每次临时安装。
Dockerfile示例
FROM mcr.microsoft.com/mssql/server:2022-latest USER root # 安装依赖并下载sqlpackage RUN apt-get update && \ apt-get install -y wget && \ wget -qO- https://aka.ms/sqlpackage-linux | tar xvzf - -C /opt/mssql/bin && \ chmod +x /opt/mssql/bin/sqlpackage USER mssql
构建镜像
docker build -t mssql-server-with-sqlpackage:2022 .
PowerShell脚本调用(容器内执行)
# 挂载bacpac到容器的备份目录 docker run -d ` --name sql-dev-container ` -e ACCEPT_EULA=Y ` -e SA_PASSWORD=YourStrong!Passw0rd ` -v ./backups:/var/opt/mssql/backups ` mssql-server-with-sqlpackage:2022 # 等待就绪后导入 Start-Sleep -Seconds 30 docker exec sql-dev-container ` /opt/mssql/bin/sqlpackage ` /Action:Import ` /SourceFile:/var/opt/mssql/backups/test-dataset.bacpac ` /TargetServerName:localhost ` /TargetDatabaseName:TestDB ` /TargetUser:sa ` /TargetPassword:YourStrong!Passw0rd
关键注意事项
- 确保SQL Server容器启动后完全就绪(可以用sqlcmd查询验证,避免导入失败)
- 跨平台路径处理:用
Resolve-Path获取绝对路径,避免Windows/Linux路径格式冲突 - 权限问题:挂载文件时确保容器有读取权限,Linux下可能需要调整文件权限
- Azure SQL导入需确保存储账号权限正确,且bacpac文件存储在Azure Blob Storage
内容的提问来源于stack exchange,提问作者user16382360
相关产品推荐
相关产品推荐

