Comment définir le fichier de configuration dans l'application .Net Core Console pour plusieurs IDE lors de l'exécution d'un conteneur Docker

Notre équipe a développé un service de traitement des messages de Kafka. C'était une application console .Net Core qui s'abonnait à des rubriques, et lorsqu'un message apparaissait dans chacune d'elles, elle exécutait un certain algorithme de traitement. Lors des premières itérations du développement de notre service, le déploiement était assez simple: nous avons publié des applications, transféré les fichiers de construction prêts à l'emploi sur le serveur, créé une image docker et lancé le service dans un conteneur. Nous avons vécu comme ça jusqu'à ce que les tests de charge nous arrivent et soient déployés dans un circuit voisin. Le fichier de configuration appsettings.json dans ces contours, bien sûr, était différent et nous avons eu une étape de plus dans notre déploiement: réparer le fichier de configuration avec des poignées. À ce stade, le facteur humain est intervenu, et parfois nous avons oublié d'éditer le fichier, ce qui a entraîné des erreurs et une perte de temps.Quand nous en avons eu assez (très vite), nous avons décidé d'appeler DevOps pour nous aider. Mais quand même, cela prenait du temps et il n'y avait plus d'effort pour éditer la configuration à la main. Ensuite, j'ai proposé et mis en œuvre une solution assez rapide, dont je veux parler dans cet article.



Voici nos conditions initiales:



  1. Notre service est une application console et, contrairement à l'application Web ASP.NET Core, nous n'avions pas de solution prête à l'emploi.
  2. L'application est lancée à partir du conteneur docker.


Eh bien, voyons comment utiliser la configuration multiple dans une application console. Commençons par créer des fichiers de configuration pour nos environnements de développement et de test:





Il n'y a pas d'imbrication par défaut dans les applications console. Par conséquent, ouvrez le fichier de projet .csproj et ajoutez:



<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>

      
      





Les fichiers joints avec le nom de l'environnement de développement sont apparus dans le fichier appsettings.json:







Dans les fichiers appsettings.Dev.json et appsettings.Testing.json, ajoutez les parties de la configuration qui changent en fonction de l'environnement. Modifions le nom des sujets Kafka dans la boucle de test de charge en ajoutant les paramètres nécessaires à appsettings.Testing.json:



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

      
      





Il ne reste plus qu'à sélectionner le fichier appsettings.json souhaité lors du démarrage du service. Pour ce faire, apportons des modifications à la classe Program:



///  
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();
}

      
      





Maintenant, tout est prêt pour démarrer le service dans un conteneur docker.



Il reste à spécifier les variables d'environnement du conteneur. Il y a plusieurs moyens de le faire:



  • ligne de commande
  • fichier texte
  • docker composer


Je me suis arrêté à spécifier des variables sur la ligne de commande. Voici un exemple de script pour créer une image et lancer un conteneur:



# Build image
# docker build . -t consoleapp

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

      
      





Il existe des solutions plus élégantes pour créer un pipeline pour votre déploiement, mais cette méthode peut être mise en œuvre en peu de temps, ce qui est très critique au stade initial de la création du projet.



Lien vers GitHub avec le projet .



Merci pour votre attention et votre codage agréable!



All Articles