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

如何搭建含预恢复.bak库的ASP.NET Core Web API Docker后端 支持前端一键启动

SQL Server 2017 Docker容器自动恢复.bak备份方案

步骤1:调整本地项目目录结构

在docker-compose.yml同级目录创建mssql-init文件夹,放入以下3类文件:

  • 你的数据库备份文件(例如xxx.bak)
  • 数据库恢复SQL脚本restore-db.sql
  • 容器自定义启动脚本entrypoint.sh

步骤2:编写数据库恢复SQL脚本

restore-db.sql内容如下,替换脚本中对应占位符即可:

-- 检查目标库是否已存在,避免重复恢复
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'替换为你的数据库名称')
BEGIN
    RESTORE DATABASE [替换为你的数据库名称] 
    FROM DISK = N'/var/opt/mssql/backup/替换为你的备份文件名.bak'
    WITH 
    MOVE N'替换为备份的逻辑数据文件名' TO N'/var/opt/mssql/data/替换为你的数据库名称.mdf',
    MOVE N'替换为备份的逻辑日志文件名' TO N'/var/opt/mssql/data/替换为你的数据库名称.ldf',
    NOUNLOAD, STATS = 5
END
GO

提示:如果不知道备份的逻辑文件名,可以在本地SSMS中执行RESTORE FILELISTONLY FROM DISK = N'本地备份文件路径.bak'查询。

步骤3:编写容器自定义启动脚本

entrypoint.sh用于等待SQL Server启动完成后自动执行恢复脚本,内容如下:

#!/bin/bash

# 后台启动SQL Server服务
/opt/mssql/bin/sqlservr &
SQL_PID=$!

# 轮询检测SQL Server是否启动成功
until /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -Q "SELECT 1" > /dev/null 2>&1
do
    echo "等待SQL Server服务启动..."
    sleep 1
done

# 执行数据库恢复脚本
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -i /usr/src/app/restore-db.sql
echo "数据库恢复完成,服务已就绪"

# 保持容器运行
wait $SQL_PID

步骤4:修改docker-compose.yml配置

调整db服务的配置,挂载本地初始化文件并替换启动入口:

version: '3.4'

services:
  api:
    image: ${DOCKER_REGISTRY-}api
    build:
      context: .
      dockerfile: Api/Dockerfile
    depends_on:
      - db
  db:
    image: "mcr.microsoft.com/mssql/server:2017-latest"
    ports:
      - "1433:1433"
    volumes:
      - "sqlvolume:/var/opt/mssql"
      # 挂载初始化脚本目录
      - "./mssql-init:/usr/src/app"
      # 挂载备份文件到容器内指定路径
      - "./mssql-init/替换为你的备份文件名.bak:/var/opt/mssql/backup/替换为你的备份文件名.bak"
    restart: always
    environment:
      SA_PASSWORD: "<替换为你的SA密码>"
      ACCEPT_EULA: "Y"
    # 替换默认启动入口为自定义脚本
    entrypoint: ["/bin/bash", "/usr/src/app/entrypoint.sh"]

volumes:
  sqlvolume:

步骤5:本地权限配置

在项目根目录执行以下命令,给启动脚本增加执行权限:

chmod +x mssql-init/entrypoint.sh

可选优化:解决API启动早于数据库就绪的问题

depends_on仅保证容器启动顺序,不等待数据库初始化完成,可在API项目中新增数据库连接重试逻辑,例如用Polly配置3-5次重试,每次间隔1秒,即可兼容数据库初始化的等待时间。

配置完成后,开发者只需执行docker-compose up即可一键启动带测试数据的完整后端服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:09:04