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

Docker Compose部署MSSQL无法读取.env文件致登录失败问题

解决MSSQL Docker容器SA密码登录失败问题

问题背景

  • 已配置.envs/.local/.mssql环境文件:
ACCEPT_EULA=Y
MSSQL_SA_PASSWORD=12Password34
  • docker-compose.yml中配置了MSSQL服务,但执行docker-compose up -d --build时出现警告:
WARN[0000] The "SA_PASSWORD" variable is not set. Defaulting to a blank string.
  • 容器启动后日志出现SA登录失败错误:
Logon       Error: 18456, Severity: 14, State: 8.
Logon       Login failed for user 'sa'. Reason: Password did not match that for the login provided.

解决方案

1. 统一环境变量名称

环境文件中定义的变量是MSSQL_SA_PASSWORD,但docker-compose.yml的healthcheck和command里误用了$SA_PASSWORD,Docker找不到该变量才抛出警告并设为空值。需将所有$SA_PASSWORD替换为$MSSQL_SA_PASSWORD:

修改后的healthcheck部分:

healthcheck:
  test: [ "CMD", "/opt/mssql-tools/bin/sqlcmd", "-S", "localhost", "-U", "sa", "-P", "$MSSQL_SA_PASSWORD", "-Q", "SELECT 1" ]
  interval: 30s
  timeout: 30s
  retries: 3

修改后的command中的密码引用:

/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $MSSQL_SA_PASSWORD -i /sql_scripts/db_setup.sql

2. 修正启动脚本执行顺序

原command先执行前台进程sqlservr,导致后续初始化脚本永远无法运行。需调整为后台启动SQL Server,等待服务就绪后再执行脚本:

更新后的完整command:

command: /bin/bash -c '
  # 后台启动SQL Server
  /opt/mssql/bin/sqlservr &
  SQLPID=$!

  # 轮询等待SQL Server就绪
  until /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $MSSQL_SA_PASSWORD -Q "SELECT 1" > /dev/null 2>&1; do
    echo "等待SQL Server启动..."
    sleep 5
  done

  # 仅首次启动时执行初始化脚本
  if [ ! -f /sql_scripts/init_done.flag ]; then
    apt-get update && apt-get install -y mssql-tools unixodbc-dev
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $MSSQL_SA_PASSWORD -i /sql_scripts/db_setup.sql
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $MSSQL_SA_PASSWORD -i /sql_scripts/second_db_setup.sql
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $MSSQL_SA_PASSWORD -i /sql_scripts/third_db_setup.sql
    touch /sql_scripts/init_done.flag
  fi

  # 等待SQL Server主进程,保持容器运行
  wait $SQLPID
'

3. 清理旧数据卷(关键步骤)

首次启动时错误的空密码已写入持久化数据卷db-data,即使修正配置,旧密码依然会生效。需删除旧卷:

# 停止并删除容器
docker-compose down

# 删除db-data卷(替换为你的实际项目卷名,通常是[项目目录名]_db-data)
docker volume rm your_project_name_db-data

完成以上修改后,重新启动容器:

docker-compose up -d --build

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:05:19