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

如何通过docker compose初始化SQL Server数据库并创建库表及测试数据

核心问题原因

微软官方的SQL Server Linux容器镜像没有内置/docker-entrypoint-initdb.d目录的自动扫描执行逻辑,这个自动执行初始化脚本的能力是MySQL、PostgreSQL等镜像自行实现的启动逻辑,不属于Docker Compose的通用功能,所以直接照搬MySQL的方案不会生效。


正确实现步骤

1. 调整初始化SQL文件

SQL Server不支持反引号包裹标识符,同时需要用GO关键字分隔批处理,将init/01.sql修改为如下内容:

CREATE DATABASE test;
GO
-- 切换到新建库执行后续建表、插数操作
USE test;
GO
-- 示例:建表+插入测试数据,可根据实际需求修改
CREATE TABLE user_info (
    id INT IDENTITY(1,1) PRIMARY KEY,
    username NVARCHAR(50) NOT NULL,
    create_time DATETIME DEFAULT GETDATE()
);
GO
INSERT INTO user_info(username) VALUES ('测试用户1'),('测试用户2');
GO

2. 新增启动初始化脚本

在init目录下新建entrypoint.sh,用于实现启动等待+自动执行SQL的逻辑:

#!/bin/bash

# 后台启动SQL Server主进程
/opt/mssql/bin/sqlservr &
MSSQL_PID=$!

# 循环等待SQL Server启动就绪
until /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -Q "SELECT 1" > /dev/null 2>&1
do
    sleep 1
done

# 执行目录下所有SQL初始化文件
echo "开始执行数据库初始化脚本"
for sql_file in /init/*.sql; do
    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -i "$sql_file"
done
echo "数据库初始化完成"

# 保持容器运行,挂载SQL Server主进程
wait $MSSQL_PID

本地给脚本添加执行权限:

chmod +x ./init/entrypoint.sh

3. 修改docker-compose.yml配置

services:
    db:
        image: "mcr.microsoft.com/mssql/server"
        ports:
            - 1433:1433
        volumes:             
            - ./init:/init
        environment:
            SA_PASSWORD: "password123!"
            ACCEPT_EULA: "Y"
        # 覆盖默认启动入口,使用我们的初始化脚本
        entrypoint: ["/bin/bash", "/init/entrypoint.sh"]

4. 启动前清理残留

如果之前已经启动过容器,需要先清空残留的volume数据,避免初始化逻辑不触发:

docker-compose down -v

内容的提问来源于stack exchange,提问作者Linda Lawton - DaImTo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:24:03