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

如何解决Docker Compose调用的.sh脚本无法读取.NET Core用户密钥中SA_PASSWORD的问题

解决Docker Compose中SQL Server容器无法读取.NET用户密钥中SA_PASSWORD的问题

问题本质

你遇到的核心问题是:SQL Server容器根本不认识.NET用户密钥机制。.NET用户密钥是.NET框架专属的配置方式,只有.NET应用会去解析usersecrets目录下的JSON文件;而SQL Server容器的SA_PASSWORD环境变量,是Docker Compose从主机的系统环境变量中读取的,和.NET用户密钥没有直接关联。你之前挂载usersecrets卷到SQL容器完全没用,因为SQL Server不会去读取这些文件。

快速解决方案(无需Docker Swarm)

我们只需要把.NET用户密钥里的SA_PASSWORD值导出到主机的环境变量中,让Docker Compose能获取到它,步骤如下:

1. 导出.NET用户密钥到主机环境变量

在Linux终端执行以下命令,把密钥值提取并设置为当前会话的环境变量:

export SA_PASSWORD=$(dotnet user-secrets get "SA_PASSWORD")

如果是Windows PowerShell,命令改为:

$env:SA_PASSWORD = dotnet user-secrets get "SA_PASSWORD"

2. 清理Docker Compose中SQL容器的无效配置

修改docker-compose.yml里的sql_in_dc服务,移除和.NET用户密钥相关的无用配置(SQL容器不需要这些):

sql_in_dc:
  build:
    context: .
    dockerfile: items/sql/sql.Dockerfile
  restart: always
  ports:
    - "1440:1433"
  environment:
    - ACCEPT_EULA=Y
    - SA_PASSWORD=$SA_PASSWORD  # 现在会从主机环境变量读取正确值
  # 移除无用的usersecrets挂载卷
  # volumes:
  #   - $APPDATA/Microsoft/UserSecrets/$USER_SECRETS_ID:/root/.microsoft/usersecrets/$USER_SECRETS_ID
  #   - $HOME/.microsoft/usersecrets/$USER_SECRETS_ID:/root/.microsoft/usersecrets/$USER_SECRETS_ID

3. 启动容器

执行Docker Compose启动命令:

docker-compose up --build

为什么这个方法有效?

  • 当你执行export SA_PASSWORD=xxx后,主机的当前终端会话会持有这个环境变量;
  • Docker Compose在解析$SA_PASSWORD时,会自动从主机环境变量中获取对应的值,传递给SQL Server容器;
  • SQL容器的setup.sh脚本就能正常读取到SA_PASSWORD环境变量,完成数据库初始化。

后续优化建议

这个方法是适合入门的快速方案,后续你可以考虑更安全的密钥管理方式:

  • 使用Docker Swarm Secrets(需要启用Swarm模式);
  • 对于云环境,使用Azure Key Vault或AWS Secrets Manager;
  • 或者把.NET应用和SQL的配置统一放到环境变量管理工具中(比如dotenv)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:27:38