。NET Core中的环境变量合并设置

问题描述 投票:7回答:1

我正在Docker中(在Kubernetes中)运行.NET Core应用程序,将环境变量传递给Docker容器并在我的应用程序中使用它们。

在我的.NET Core应用程序中,我具有以下C#类:

public class EnvironmentConfiguration
{
    public string EXAMPLE_SETTING { get; set; }
    public string MY_SETTING_2 { get; set; }
}

我将appsettings设置为:

config.
    AddJsonFile("appsettings.json").
    AddJsonFile($"appsettings.docker.json", true).
    AddEnvironmentVariables();  

DI设置:

services.Configure<EnvironmentConfiguration>(Configuration);

并且在我的控制器中,我按如下方式使用它:

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/my")]
public class MyController : Controller
{
    private readonly IOptions<EnvironmentConfiguration> _environmentConfiguration;

    public MyController(IOptions<EnvironmentConfiguration> environmentConfiguration)
    {
        _environmentConfiguration = environmentConfiguration;
    }
}       

我运行docker:

docker run -p 4000:5000 --env-file=myvariables

文件myvariables看起来像这样:

EXAMPLE_SETTING=example!!!
MY_SETTING_2=my-setting-2!!!!

这有效。我可以使用_environmentConfiguration并看到设置了我的变量。

但是...我想将环境变量与appsettings合并,以便在未找到环境变量时将appsettings中的值用作备用。以某种方式合并这两行:

services.Configure<EnvironmentConfiguration>(settings => Configuration.GetSection("EnvironmentConfiguration").Bind(settings));
services.Configure<EnvironmentConfiguration>(Configuration);

这有可能吗?

我的后备计划是从EnvironmentConfiguration类继承,并使用单独的DI注入两个单独的配置,然后在代码中“手动”合并它们,但此解决方案是不可取的。

docker .net-core environment-variables config
1个回答
17
投票
config.
    AddJsonFile("appsettings.json").
    AddJsonFile("appsettings.docker.json", true).
    AddEnvironmentVariables();

实际上足以使用环境变量覆盖应用设置值。

假设您在appsettings.json文件中具有以下内容;

{
  "Logging": {
      "Level": "Debug"
  }
}

您可以通过将环境变量“ Logging:Level”设置为另一个值来覆盖Logging.Level的值。

请注意,:用于指定环境变量键中的嵌套属性。

来自docs;

如果在系统的环境变量中不能使用冒号(:),请用双下划线(__)替换冒号(:)。

© www.soinside.com 2019 - 2024. All rights reserved.