Docker-compose部署MSSQL时setup.sql初始化脚本不生效且登录失败求助
问题原因汇总
- 通配符被引号包裹失效:你写的
/scripts/"*.sql"把通配符*用引号包裹后,bash不会解析通配符匹配真实文件,只会把"*.sql"当做一个不存在的文件名 - 初始化脚本根本没有执行:你的for循环里只打印了文件名,没有调用
sqlcmd执行对应的SQL脚本,所以system用户和probna库根本没有创建,自然登录失败 - 变量未转义:compose文件中
$foo没有加第二个$转义,docker-compose会尝试解析宿主环境的foo变量,找不到就抛出变量未设置的告警 - 末尾等待进程的变量名写错:最后一行的
wait $$pi是笔误,应该是wait $$pid,否则会抛出找不到pid的错误
修正后的可用方案
1. 调整本地文件结构
在你想要存放配置的目录下创建如下结构:
your_project/ ├─ docker-compose.yml └─ init/ └─ setup.sql
把你现有的setup.sql放到init目录下即可。
2. 修改docker-compose.yml内容
version: "3.7" services: sql-server-db: container_name: sql-server-db image: mcr.microsoft.com/mssql/server:2019-latest ports: - "1433:1433" environment: SA_PASSWORD: "secret123new!" ACCEPT_EULA: "Y" MSSQL_PID: "Express" volumes: # 持久化数据库数据,避免容器重启数据丢失 - ./mssql_data:/var/opt/mssql # 挂载初始化脚本目录 - ./init:/scripts command: - /bin/bash - -c - | # 启动SQL Server后台运行 /opt/mssql/bin/sqlservr & pid=$$! # 等待SQL Server启动完成 echo "等待MSSQL启动..." until /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "secret123new!" -Q "SELECT 1" > /dev/null 2>&1 do sleep 5 echo "重试连接中..." done # 仅第一次启动执行初始化脚本,避免重复执行报错 if [ ! -f /var/opt/mssql/init_done ]; then echo "开始执行初始化SQL脚本" for sql_file in /scripts/*.sql do echo "执行脚本:$$sql_file" /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "secret123new!" -i "$$sql_file" done # 创建初始化完成标记 touch /var/opt/mssql/init_done echo "所有初始化脚本执行完成" fi # 等待SQL Server主进程运行 wait $$pid
3. Windows下启动步骤
无需安装node.js,直接按以下操作:
- 打开PowerShell,cd到你的
your_project目录 - 执行命令:
docker-compose up -d - 等待1-2分钟让初始化完成,再用DBeaver连接
- 连接配置:主机填
localhost,端口1433,用户名system,密码system,默认数据库选probna即可
验证方法
如果不确定是否初始化成功,可以执行docker logs sql-server-db查看日志,能看到「所有初始化脚本执行完成」的提示就说明配置正常。
内容的提问来源于stack exchange,提问作者patplo1999
相关产品推荐
相关产品推荐

