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

docker-compose启动时MSSQL服务的Entrypoint.sh脚本未执行无法创建SQL登录

问题根因与解决方案

核心问题1:Shell脚本逻辑阻塞

你在Entrypoint.sh中先执行了前台阻塞命令/opt/mssql/bin/sqlservr,该命令不会主动退出,因此后续等待服务启动、创建登录的代码永远不会被执行。

核心问题2:脚本执行权限/路径问题

  1. 挂载进入容器的Shell脚本默认可能没有可执行权限,直接调用会启动失败
  2. 使用相对路径./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

验证步骤

  1. 本地执行chmod +x DockerScripts/Shell/Entrypoint.sh 给脚本添加可执行权限
  2. 确认所有脚本换行符为LF格式,无Windows的CRLF字符
  3. 重新启动compose栈,查看mssql容器日志确认创建登录的日志输出

内容的提问来源于stack exchange,提问作者Arthur Edgarov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:15:11