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

docker-compose部署MS SQL时用初始化脚本创建数据库失败如何解决

问题产生原因
  • MSSQL官方镜像无自动执行初始化目录脚本的逻辑:docker-entrypoint-initdb.d目录自动执行SQL脚本是MySQL、PostgreSQL等镜像的通用约定,微软官方发布的MSSQL Server镜像并未内置该逻辑,你挂载到该目录的脚本不会被自动触发执行。
  • SQL语法不兼容:你写的CREATE DATABASE IF NOT EXISTS是MySQL专属语法,MSSQL 不支持该写法,就算手动执行该脚本也会直接报错,无法创建数据库。
  • SA密码不符合复杂度要求:MSSQL默认要求SA密码长度至少8位,同时包含大小写字母、数字、特殊字符三类字符,你配置的password强度不足,会直接导致MSSQL服务启动失败。
修复步骤

1. 修正初始化SQL脚本

将init-script.sql内容替换为MSSQL兼容的语法:

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'some_name')
BEGIN
    CREATE DATABASE some_name;
END
GO
USE some_name;
GO

2. 新增脚本自动执行逻辑

新建自定义启动脚本start.sh,放在docker-compose.yml同级目录,内容如下:

#!/bin/bash

# 启动MSSQL主进程
/opt/mssql/bin/sqlservr &
MSSQL_PID=$!

# 轮询等待MSSQL服务就绪
until /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "${SA_PASSWORD}" -Q "SELECT 1" > /dev/null 2>&1
do
    sleep 2
done

# 执行初始化SQL脚本
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "${SA_PASSWORD}" -i /docker-entrypoint-initdb.d/init-script.sql

# 等待主进程,保持容器运行
wait ${MSSQL_PID}

给脚本添加可执行权限:
chmod +x start.sh

3. 修正docker-compose.yml配置

修改后的配置如下,替换原来的配置即可:

version: "3"
services:
  database:
    restart: always
    image: mcr.microsoft.com/mssql/server
    container_name: ms-sql-server-latest
    volumes:
      - ./init-script.sql:/docker-entrypoint-initdb.d/init-script.sql
      - ./start.sh:/usr/local/bin/start.sh
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=YourStrong@Pass123 # 替换为符合复杂度要求的密码
    ports:
      - 14033:1433
    entrypoint: ["/bin/bash", "/usr/local/bin/start.sh"]

配置修改完成后,先删除旧的容器和卷,再重新启动即可:
docker compose down -v && docker compose up -d


内容的提问来源于stack exchange,提问作者Renzo Redoran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:15:04