web-dev-qa-db-ja.com

.NET Coreでのappsettingsと環境変数のマージ

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

ファイルmyvariablesは次のようになります。

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

これは機能します。 _environmentConfigurationと私の変数が設定されていることを確認します。

ただし...環境変数がappsettingsにマージされ、環境変数が見つからない場合のappsettingsの値がフォールバックとして使用されるようにしたいと思います。どういうわけかこれらの2行をマージします。

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

これはどういうわけか可能ですか?

私のフォールバック計画は、EnvironmentConfigurationクラスから継承し、別個のDIを使用して2つの別個の構成を挿入してから、それらをコードで「手動」でマージすることですが、このソリューションは望ましくありません。

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

実際には、環境変数を使用してappsettingsの値をオーバーライドするのに十分です。

Appsettings.jsonファイルに次の内容があるとします。

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

環境変数「Logging:Level」を別の値に設定することにより、Logging.Levelの値を上書きできます。

:は、環境変数キーでネストされたプロパティを指定するために使用されることに注意してください。

また注意:from docs ;

システムの環境変数でコロン(:)を使用できない場合は、コロン(:)を二重下線(__)に置き換えます。

21
Hasan