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

如何通过docker-compose.yml执行init.sql初始化SQL Server容器数据库?

SQL Server容器初始化脚本不执行问题解决

问题描述

使用docker-compose部署SQL Server 2019容器时,挂载了init.sql到容器内的/docker-entrypoint-initdb.d/路径,但脚本未自动执行,无法创建my_database数据库。相关配置如下:

docker-compose.yml 配置

version: "3.9"
services:
    mssql-service:
        image: mcr.microsoft.com/mssql/server:2019-latest
        container_name: mssql
        restart: unless-stopped
        ports:
            - "1433:1433"
        environment:
            - ACCEPT_EULA=Y
            - SA_PASSWORD=my_password
            - MSSQL_PID=Developer
            - MSSQL_AGENT_ENABLED=True
        volumes:
            - sqlvolume:/var/opt/mssql
            - C:/Users/joel_/Documents/GitLab/Emaresa/apps/api/init.sql:/docker-entrypoint-initdb.d/init.sql

init.sql 脚本

USE master;
GO

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'my_database')
CREATE DATABASE my_database;
GO

项目目录结构

project/
│   .gitignore
│   alembic.ini
│   database.env
│   docker-command.bash
│   docker-compose.yml
│   init.sql
│   poetry.lock
│   pyproject.toml

核心原因

官方SQL Server Docker镜像不会自动执行/docker-entrypoint-initdb.d/目录下的脚本——这个路径是MySQL、PostgreSQL等镜像的约定,SQL Server镜像没有内置该初始化逻辑,需要手动添加执行脚本的命令。

解决方案

方案一:添加启动命令,等待服务就绪后执行脚本

修改docker-compose.yml中的mssql-service,添加command参数,让容器启动SQL Server服务后,等待服务就绪再执行初始化脚本:

version: "3.9"
services:
    mssql-service:
        image: mcr.microsoft.com/mssql/server:2019-latest
        container_name: mssql
        restart: unless-stopped
        ports:
            - "1433:1433"
        environment:
            - ACCEPT_EULA=Y
            - SA_PASSWORD=my_password
            - MSSQL_PID=Developer
            - MSSQL_AGENT_ENABLED=True
        volumes:
            - sqlvolume:/var/opt/mssql
            # 改用相对路径挂载,避免绝对路径适配问题
            - ./init.sql:/docker-entrypoint-initdb.d/init.sql
        command: >
            bash -c "
            # 启动SQL Server服务
            /opt/mssql/bin/sqlservr &
            # 记录服务PID,后续保持容器运行
            SQL_PID=$$!
            # 循环检查服务是否就绪,替代固定sleep的不确定性
            until /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'my_password' -Q 'SELECT 1' > /dev/null 2>&1; do
                echo '等待SQL Server服务就绪...'
                sleep 5
            done
            # 执行初始化脚本
            echo '开始执行初始化脚本...'
            /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'my_password' -d master -i /docker-entrypoint-initdb.d/init.sql
            # 等待服务进程,保持容器运行
            wait $$SQL_PID
            "

方案二:修正挂载路径(若路径不匹配)

当前挂载的绝对路径C:/Users/joel_/Documents/GitLab/Emaresa/apps/api/init.sql与项目目录中init.sql的位置不符,建议改为相对路径挂载,确保脚本能正确映射到容器内:

- ./init.sql:/docker-entrypoint-initdb.d/init.sql

方案三:手动验证脚本执行

若修改后仍未生效,可进入容器手动执行脚本排查问题:

  1. 进入容器:
    docker exec -it mssql bash
    
  2. 手动执行脚本:
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'my_password' -d master -i /docker-entrypoint-initdb.d/init.sql
    
    查看是否有报错信息,比如密码错误、脚本语法问题等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:57