docker-compose部署MS SQL时用初始化脚本创建数据库失败如何解决
问题产生原因
- MSSQL官方镜像无自动执行初始化目录脚本的逻辑:
docker-entrypoint-initdb.d目录自动执行SQL脚本是MySQL、PostgreSQL等镜像的通用约定,微软官方发布的MSSQL Server镜像并未内置该逻辑,你挂载到该目录的脚本不会被自动触发执行。 - SQL语法不兼容:你写的
CREATE DATABASE IF NOT EXISTS是MySQL专属语法,MSSQL 不支持该写法,就算手动执行该脚本也会直接报错,无法创建数据库。 - SA密码不符合复杂度要求:MSSQL默认要求SA密码长度至少8位,同时包含大小写字母、数字、特殊字符三类字符,你配置的
password强度不足,会直接导致MSSQL服务启动失败。
修复步骤
1. 修正初始化SQL脚本
将init-script.sql内容替换为MSSQL兼容的语法:
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'some_name') BEGIN CREATE DATABASE some_name; END GO USE some_name; GO
2. 新增脚本自动执行逻辑
新建自定义启动脚本start.sh,放在docker-compose.yml同级目录,内容如下:
#!/bin/bash # 启动MSSQL主进程 /opt/mssql/bin/sqlservr & MSSQL_PID=$! # 轮询等待MSSQL服务就绪 until /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "${SA_PASSWORD}" -Q "SELECT 1" > /dev/null 2>&1 do sleep 2 done # 执行初始化SQL脚本 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "${SA_PASSWORD}" -i /docker-entrypoint-initdb.d/init-script.sql # 等待主进程,保持容器运行 wait ${MSSQL_PID}
给脚本添加可执行权限:chmod +x start.sh
3. 修正docker-compose.yml配置
修改后的配置如下,替换原来的配置即可:
version: "3" services: database: restart: always image: mcr.microsoft.com/mssql/server container_name: ms-sql-server-latest volumes: - ./init-script.sql:/docker-entrypoint-initdb.d/init-script.sql - ./start.sh:/usr/local/bin/start.sh environment: - ACCEPT_EULA=Y - SA_PASSWORD=YourStrong@Pass123 # 替换为符合复杂度要求的密码 ports: - 14033:1433 entrypoint: ["/bin/bash", "/usr/local/bin/start.sh"]
配置修改完成后,先删除旧的容器和卷,再重新启动即可:docker compose down -v && docker compose up -d
内容的提问来源于stack exchange,提问作者Renzo Redoran
相关产品推荐
相关产品推荐

