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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:30:50