appsetting.json 中的变量如何与实际值交换?

how does a variable in appsetting.json get swapped with actual value?

在一些asp.net核心项目中,我经常在appsetting.json文件中看到这样的东西:

{
   "Logging": {
      "LogLevel": {
        "Default": "Warning"
      }
   },
   "UserName" : "${userName}"
}

${userName} 看起来像一个可以被 docker/k8s 等交换的变量模板,但它是如何工作的,因为在应用程序内部,我仍然访问 UserName 为:

var userName = _configuration["UserName"];  // output is "${userName}"

所以docker改变了变量模板?它是否直接更新appsetting.json文件,例如docker将使用docker文件中的ENV值来扫描appsetting.json文件并与实际交换${userName}值?

这看起来像是针对 appsettings.json 中的“UserName”键存储的内插字符串。

您将依赖代码(C# 等)在 运行 时间替换用户名值,而不是与容器 运行 时间有任何关系。

当通过各种替代方案(Docker、Docker Compose、Kubernetes 等)实例化容器时,您将在容器(pods 在 K8s 的情况下传递环境变量) 创建容器时。

这个(环境变量的注入)如何完成取决于你如何启动你的容器。想法是相同的,但语法可能会有所不同,具体取决于您使用的是“docker 运行”,还是“docker compose”或“kubernetes”等。但原理是相同的.

在 .NET Core 容器的情况下,您将依赖“优先顺序”来导出 ConfigurationManager 的值,例如https://devblogs.microsoft.com/premier-developer/order-of-precedence-when-configuring-asp-net-core/

容器不会 modify/inject/swap 已部署容器中的底层代码库。

但是,他们可以在实例化时将环境变量注入 container/pod。

不确定我是否正确解释了你的问题。