如何搭建含预恢复.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
相关产品推荐
相关产品推荐

