docker-compose启动时MSSQL服务的Entrypoint.sh脚本未执行无法创建SQL登录
问题根因与解决方案
核心问题1:Shell脚本逻辑阻塞
你在Entrypoint.sh中先执行了前台阻塞命令/opt/mssql/bin/sqlservr,该命令不会主动退出,因此后续等待服务启动、创建登录的代码永远不会被执行。
核心问题2:脚本执行权限/路径问题
- 挂载进入容器的Shell脚本默认可能没有可执行权限,直接调用会启动失败
- 使用相对路径
./Entrypoint.sh依赖容器工作目录配置,容易出现路径找不到的问题
核心问题3:SQL变量未正确传入
你在CreateLogin.sql中使用了$(LOGIN)、$(PASSWORD)变量,需要在调用sqlcmd时显式传入环境变量,否则变量不会被识别替换。
修改方案
1. 替换DockerScripts/Shell/Entrypoint.sh内容
#!/bin/bash # 启动SQL Server到后台 /opt/mssql/bin/sqlservr & PID=$! # 等待MSSQL启动完成 export STATUS=1 i=0 while [[ $STATUS -ne 0 ]] && [[ $i -lt 30 ]]; do i=$((i+1)) sleep 1 /opt/mssql-tools/bin/sqlcmd -t 1 -U sa -P "$SA_PASSWORD" -Q "select 1" > /dev/null 2>&1 STATUS=$? done if [ $STATUS -ne 0 ]; then echo "Error: MS SQL Server 30秒内未启动成功" exit 1 fi echo "MS SQL Server 启动成功,开始创建登录账户" # 执行SQL脚本,传入环境变量 /opt/mssql-tools/bin/sqlcmd -U sa -P "$SA_PASSWORD" -S localhost -v LOGIN="$LOGIN" PASSWORD="$PASSWORD" -i /CreateLogin.sql echo "登录账户创建完成" # 等待sqlservr进程,保持容器运行 wait $PID
2. 修改docker-compose.yml中mssql服务配置
修正entrypoint调用逻辑,添加健康检查保证应用服务在SQL初始化完成后再启动:
services: mssql: image: mcr.microsoft.com/mssql/server:2019-latest environment: SA_PASSWORD: "3qqimIuTQEGqVCD!" ACCEPT_EULA: "Y" LOGIN: "MyLogin" PASSWORD: "3qqimIuTQEGqVCD!" ports: - "1433:1433" volumes: - ./DockerScripts/SQL/CreateLogin.sql:/CreateLogin.sql - ./DockerScripts/Shell/Entrypoint.sh:/Entrypoint.sh entrypoint: ["/bin/bash", "-c", "chmod +x /Entrypoint.sh && /Entrypoint.sh"] healthcheck: test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -U sa -P '3qqimIuTQEGqVCD!' -Q 'select 1' || exit 1"] interval: 5s timeout: 10s retries: 10 webapi: image: ${DOCKER_REGISTRY-}webapi build: context: . dockerfile: Source/Code/Web/WebApi/Dockerfile depends_on: mssql: condition: service_healthy maintenance: image: ${DOCKER_REGISTRY-}maintenance build: context: . dockerfile: Source/Code/Web/Maintenance/Dockerfile depends_on: mssql: condition: service_healthy
验证步骤
- 本地执行
chmod +x DockerScripts/Shell/Entrypoint.sh给脚本添加可执行权限 - 确认所有脚本换行符为LF格式,无Windows的CRLF字符
- 重新启动compose栈,查看mssql容器日志确认创建登录的日志输出
内容的提问来源于stack exchange,提问作者Arthur Edgarov
相关产品推荐
相关产品推荐

