如何通过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
相关产品推荐
相关产品推荐

