将appsettings与.NET Core中的环境变量合并

时间:2018-01-17 10:01:10

标签: docker .net-core environment-variables config

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

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

margin-top:-170px;

我设置了我的public class EnvironmentConfiguration { public string EXAMPLE_SETTING { get; set; } public string MY_SETTING_2 { get; set; } }

appsettings

DI设置:

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

在我的控制器中,我使用它:

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 run -p 4000:5000 --env-file=myvariables 如下所示:

myvariables

这很有效。我可以使用我的EXAMPLE_SETTING=example!!! MY_SETTING_2=my-setting-2!!!! 并查看我的变量已设置。

然而......我想将环境变量与appsettings合并,以便在找不到环境变量时将appsettings的值用作回退。以某种方式合并这两行:

_environmentConfiguration

这有可能吗?

我的后备计划是从services.Configure<EnvironmentConfiguration>(settings => Configuration.GetSection("EnvironmentConfiguration").Bind(settings)); services.Configure<EnvironmentConfiguration>(Configuration); 类继承并使用单独的DI来注入两个单独的配置,然后合并它们&#34;手动&#34;在代码中,但这种解决方案是不可取的。

1 个答案:

答案 0 :(得分:13)

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

实际上足以使用环境变量覆盖appsettings值。

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

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

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

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

来自docs;

  

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