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

Docker部署SQL Server时无法执行初始化SQL脚本求助

问题解决:Docker部署SQL Server初始化脚本执行失败

问题根源

你的CMD命令会在SQL Server容器启动后立刻执行初始化脚本,但此时SQL服务还未完成启动初始化,导致连接超时失败。而手动进入容器时,服务已经完全就绪,所以命令能正常执行。固定sleep的方式不可靠,因为不同环境下SQL Server启动耗时差异较大。

解决方案:使用自定义入口脚本等待服务就绪

通过编写shell脚本,循环检测SQL服务状态,确认就绪后再执行初始化脚本,同时保证容器正常运行。

1. 创建自定义入口脚本

在./docker/mssql目录下新建entrypoint.sh文件,内容如下:

#!/bin/bash
set -e

# 启动SQL Server服务并后台运行
/opt/mssql/bin/sqlservr &

# 循环检测服务是否就绪
until /opt/mssql-tools/bin/sqlcmd -S localhost,1433 -U sa -P "$SA_PASSWORD" -Q "SELECT 1" > /dev/null 2>&1; do
    echo "等待SQL Server服务启动..."
    sleep 5
done

# 执行初始化脚本
echo "SQL Server就绪,开始执行初始化脚本..."
/opt/mssql-tools/bin/sqlcmd -S localhost,1433 -U sa -P "$SA_PASSWORD" -i /var/opt/mssql/scripts/create-from-mdf.sql

# 等待后台SQL进程,防止容器退出
wait

2. 修改Dockerfile

更新./docker/mssql/Dockerfile,替换原有CMD逻辑:

FROM mcr.microsoft.com/mssql/server:2019-CU15-ubuntu-20.04

# 复制自定义入口脚本并赋予执行权限
COPY ./entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh

EXPOSE 1433

# 设置入口脚本
ENTRYPOINT ["entrypoint.sh"]

3. 目录结构说明

确保你的docker/mssql目录结构如下:

docker/mssql/
├── Dockerfile
├── entrypoint.sh
└── scripts/
    └── create-from-mdf.sql

4. 重新部署

执行以下命令重新构建并启动容器:

docker-compose down
docker-compose up --build -d

关键说明

  • 脚本中通过$SA_PASSWORD引用环境变量,避免硬编码密码,与docker-compose配置保持一致
  • 循环检测替代固定sleep,适配不同环境的启动耗时
  • 最后通过wait命令保持容器运行,避免脚本执行完成后容器退出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:20:25