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

Docker Compose部署SQL Server容器时初始化脚本未执行问题求助

问题分析与解决:MSSQL容器初始化脚本未执行

核心问题

MSSQL Server官方Docker镜像不支持通过/docker-entrypoint-initdb.d目录自动执行初始化脚本——这个机制是MySQL、PostgreSQL等镜像的特性,MSSQL没有内置该逻辑,这是你配置无效的根本原因。

解决方法

下面提供两种可靠的初始化方案,适配你的Docker Compose场景:

方案1:自定义启动脚本并行执行初始化

  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
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:15:29