So legen Sie die Konfigurationsdatei in der .Net Core Console-App für mehrere IDEs fest, wenn Sie den Docker-Container ausführen

Unser Team hat einen Nachrichtenverarbeitungsservice von Kafka entwickelt. Es war eine .Net Core-Konsolenanwendung, die Themen abonnierte, und als in jedem eine Nachricht erschien, führte sie einen bestimmten Verarbeitungsalgorithmus aus. Bei den ersten Iterationen der Entwicklung unseres Dienstes war die Bereitstellung recht einfach: Wir haben Anwendungen veröffentlicht, die vorgefertigten Build-Dateien auf den Server übertragen, ein Docker-Image erstellt und den Dienst in einem Container gestartet. Wir lebten so, bis Lasttests zu uns kamen und in einem benachbarten Stromkreis eingesetzt wurden. Die Konfigurationsdatei appsettings.json in diesen Konturen war natürlich anders, und wir hatten einen weiteren Schritt in unserer Bereitstellung - das Korrigieren der Konfigurationsdatei mit Handles. Zu diesem Zeitpunkt griff der menschliche Faktor ein, und manchmal vergaßen wir, die Datei zu bearbeiten, was zu Fehlern und Zeitverschwendung führte.Als wir es satt hatten (sehr schnell), beschlossen wir, DevOps anzurufen, um zu helfen. Trotzdem dauerte es einige Zeit und es gab keinen Aufwand mehr, die Konfiguration von Hand zu bearbeiten. Dann habe ich eine ziemlich schnelle Lösung gefunden und implementiert, über die ich in diesem Artikel sprechen möchte.



Hier sind unsere Ausgangsbedingungen:



  1. Unser Service ist die Konsolenanwendung, und im Gegensatz zur ASP.NET Core-Webanwendung hatten wir keine sofort einsatzbereite Lösung.
  2. Die Anwendung wird über den Docker-Container gestartet.


Lassen Sie uns sehen, wie Sie die Mehrfachkonfiguration in einer Konsolenanwendung verwenden. Lassen Sie uns zunächst Konfigurationsdateien für unsere Entwicklungs- und Testumgebungen erstellen:





In Konsolenanwendungen gibt es keine Standardverschachtelung. Öffnen Sie daher die .csproj-Projektdatei und fügen Sie Folgendes hinzu:



<ItemGroup>
	<Content Include="appsettings.json">
		<CopyToOutputDirectory>Always</CopyToOutputDirectory>
	</Content>
	<Content Include="appsettings.Dev.json;appsettings.Testing.json;">
		<DependentUpon>appsettings.json</DependentUpon>
		<CopyToOutputDirectory>Always</CopyToOutputDirectory>
	</Content>
</ItemGroup>

      
      





Angehängte Dateien mit dem Namen der Entwicklungsumgebung wurden in der Datei appsettings.json angezeigt:







Fügen Sie in den Dateien appsettings.Dev.json und appsettings.Testing.json die Teile der Konfiguration hinzu, die sich je nach Umgebung ändern. Lassen Sie uns den Namen der Kafka-Themen in der Lasttestschleife ändern, indem wir die erforderlichen Parameter zu appsettings.Testing.json hinzufügen:



{
  "Kafka": 
  {
    "EventMainTopicTitle": "Test_EventMain",
    "EventDelayTopicTitle": "Test_EventDelay",
    "EventRejectTopicTitle": "Test_EventReject"
  }
}

      
      





Es bleibt nur die Auswahl der gewünschten Datei appsettings.json während des Starts des Dienstes. Nehmen Sie dazu Änderungen an der Program-Klasse vor:



///  
private static IServiceProvider ConfigureServices()
{
    //    
    const string environmentVariableName = "ASPNETCORE_ENVIRONMENT";
    //    
    var environmentName = 
        Environment.GetEnvironmentVariable(environmentVariableName);

    var services = new ServiceCollection();

    _configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
        .AddJsonFile("appsettings.json")
        //  json-   environmentName
        .AddJsonFile($"appsettings.{environmentName}.json")
        .AddEnvironmentVariables()
        .Build();

    services.AddSingleton(_configuration);
    services.AddSingleton<KafkaHandler>();

    return services.BuildServiceProvider();
}

      
      





Jetzt ist alles bereit, um den Dienst in einem Docker-Container zu starten.



Es bleiben die Umgebungsvariablen für den Container anzugeben. Es gibt verschiedene Möglichkeiten, dies zu tun:



  • Befehlszeile
  • Textdatei
  • Docker komponieren


Ich habe aufgehört, Variablen in der Befehlszeile anzugeben. Hier ist ein Beispielskript zum Erstellen eines Images und Ausführen eines Containers:



# Build image
# docker build . -t consoleapp

# Run container on Dev
# docker run -d <i>--env ASPNETCORE_ENVIRONMENT=Dev</i> --name app consoleapp

      
      





Es gibt elegantere Lösungen zum Erstellen einer Pipeline für Ihre Bereitstellung. Diese Methode kann jedoch in kurzer Zeit implementiert werden, was in der Anfangsphase der Projekterstellung sehr wichtig ist.



Link zu GitHub mit dem Projekt .



Vielen Dank für Ihre Aufmerksamkeit und angenehme Codierung!



All Articles