如何通过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
方案三:手动验证脚本执行
若修改后仍未生效,可进入容器手动执行脚本排查问题:
- 进入容器:
docker exec -it mssql bash - 手动执行脚本:
查看是否有报错信息,比如密码错误、脚本语法问题等。/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
相关产品推荐
相关产品推荐

