Docker Compose部署SQL Server容器时初始化脚本未执行问题求助
问题分析与解决:MSSQL容器初始化脚本未执行
核心问题
MSSQL Server官方Docker镜像不支持通过/docker-entrypoint-initdb.d目录自动执行初始化脚本——这个机制是MySQL、PostgreSQL等镜像的特性,MSSQL没有内置该逻辑,这是你配置无效的根本原因。
解决方法
下面提供两种可靠的初始化方案,适配你的Docker Compose场景:
方案1:自定义启动脚本并行执行初始化
创建初始化脚本
init-db.sh(和docker-compose.yml同目录):#!/bin/bash # 等待SQL Server完成启动(根据机器性能调整sleep时间) sleep 30s # 使用sqlcmd执行初始化脚本 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$MSSQL_SA_PASSWORD" -i /db-schema.sql给脚本添加执行权限:
chmod +x init-db.sh修改docker-compose.yml配置:
version: '3.8' services: db: image: mcr.microsoft.com/mssql/server:2022-latest ports: - "1433:1433" volumes: - ./db-schema.sql:/db-schema.sql - ./init-db.sh:/init-db.sh environment: ACCEPT_EULA: Y MSSQL_SA_PASSWORD: "CiaoCiao69!" # 并行运行初始化脚本和SQL Server主进程 command: /bin/bash -c "/init-db.sh & /opt/mssql/bin/sqlservr"
方案2:独立初始化服务(推荐)
通过新增一个依赖服务,等待数据库就绪后执行脚本,避免sleep时间不准确的问题:
version: '3.8' services: db: image: mcr.microsoft.com/mssql/server:2022-latest ports: - "1433:1433" environment: ACCEPT_EULA: Y MSSQL_SA_PASSWORD: "CiaoCiao69!" # 健康检查:确保数据库真正就绪 healthcheck: test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '$$MSSQL_SA_PASSWORD' -Q 'SELECT 1' || exit 1"] interval: 10s retries: 5 start_period: 30s # 专门用于初始化数据库的服务,执行完成后自动退出 db-init: image: mcr.microsoft.com/mssql-tools volumes: - ./db-schema.sql:/db-schema.sql depends_on: db: condition: service_healthy command: /bin/bash -c "/opt/mssql-tools/bin/sqlcmd -S db -U SA -P 'CiaoCiao69!' -i /db-schema.sql"
额外注意事项
- 确认
db-schema.sql文件路径正确:必须和docker-compose.yml在同一目录,否则挂载失败脚本无法执行。 - 脚本SQL语句需规范:若需要创建数据库,需先执行
CREATE DATABASE YourDBName;,再通过USE YourDBName;指定后续操作的数据库,或在sqlcmd命令中添加-d YourDBName参数。 - ASP.NET项目集成:后续可在docker-compose中添加web服务,连接字符串使用Docker内部域名:
Server=db,1433;Database=YourDB;User Id=SA;Password=CiaoCiao69!;TrustServerCertificate=True;(启用TrustServerCertificate用于本地开发环境)。
内容的提问来源于stack exchange,提问作者exrezzo
相关产品推荐
相关产品推荐

