Donnerstag, Mai 28, 2020

Zusammenführen appsettings mit Umgebungsvariablen in .NET Core

Läuft bei mir ein .NETTO-Kern-app im Andockfenster (in Kubernetes), die environment-Variablen, um die Docker-container und mit Ihnen in meiner app.

In meine .NET-Core-app habe ich die folgende C# – Klasse:

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

Und ich meine setup – appsettings als solche:

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

DI-setup:

services.Configure<EnvironmentConfiguration>(Configuration);

Und in meinen Controller benutze ich es als solche:

[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;
    }
}       

Ich laufen docker:

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

Die Datei myvariables sieht wie folgt aus:

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

Dieser funktioniert. Ich kann mit meinem _environmentConfiguration und sehen, dass meine Variablen gesetzt sind.

Aber… ich würde gerne Zusammenführen von environment-Variablen mit appsettings so, dass die Werte aus den appsettings verwendet werden, als fallback, wenn die environment-Variablen werden nicht gefunden. Irgendwie verschmelzen diese beiden Zeilen:

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

Ist das irgendwie möglich?

Meine fallback-plan ist es, zu Erben von der EnvironmentConfiguration Klasse und verwenden Sie eine separate DI zwei separate Konfigurationen injiziert und dann verschmelzen Sie „manuell“ im code, aber diese Lösung ist nicht wünschenswert.

InformationsquelleAutor Marcus | 2018-01-17

1 Kommentar

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

    ist eigentlich genug, um zu überschreiben, appsettings-Werte mit Umgebungsvariablen.

    Lassen Sie uns sagen, Sie haben das folgende in deiner appsettings.json-Datei;

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

    können Sie überschreiben den Wert Logging.Level durch die Einstellung der Umwelt vairable „Logging:Level“ auf einen anderen Wert.

    Sich bewusst sein, dass : wird verwendet, um anzugeben, verschachtelte Eigenschaften in der Umwelt der variable Schlüssel.

    Beachten Sie auch: von docs;

    Wenn Sie einen Doppelpunkt (:) nicht verwendet werden können, die in Umgebungsvariablen auf Ihrem system, ersetzen Sie den Doppelpunkt (:) mit einem doppelten Unterstrich (__).

    • Doppelten Unterstrich wirklich gelöst ist mein problem mit Umgebungsvariablen in docker
    • Doppelten Unterstrich ist wirklich der Weg zu gehen… auch bei der Bereitstellung in azure container-Instanzen, in denen Sie übergeben werden sollen geschachtelte Konfiguration Werte.
    • Wird die Reihenfolge dieser Kette beeinflussen, welche Quelle hat Vorrang? Wenn wir den code neu anordnen oben config.AddEnvironmentVariables().AddJsonFile("appsettings.json").AddJsonFile($"appsettings.docker.json", true); würde Wertvorstellungen in appsettings.docker.json Vorrang vor den Werten in den anderen beiden Quellen, da hieß es letzten?
    • Ich habe gerade dabei ertappt worden, mit der Bestellung – setzen AddEnvironmentVariables() als der Letzte Anruf, oder es funktioniert nicht!!!

Kostenlose Online-Tests