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
相关产品推荐
相关产品推荐

