Cómo configurar el archivo de configuración en la aplicación .Net Core Console para múltiples IDE cuando se ejecuta el contenedor Docker

Nuestro equipo desarrolló un servicio de procesamiento de mensajes de Kafka. Era una aplicación de consola .Net Core que se suscribía a temas, y cuando aparecía un mensaje en cada uno de ellos realizaba un determinado algoritmo de procesamiento. En las primeras iteraciones del desarrollo de nuestro servicio, la implementación fue bastante simple: publicamos aplicaciones, transferimos los archivos de construcción listos para usar al servidor, creamos una imagen de Docker y lanzamos el servicio en un contenedor. Vivimos así hasta que nos llegaron las pruebas de carga y se desplegaron en un circuito vecino. El archivo de configuración appsettings.json en estos contornos, por supuesto, era diferente y teníamos un paso más en nuestra implementación: arreglar el archivo de configuración con identificadores. En esta etapa intervino el factor humano, y en ocasiones nos olvidamos de editar el archivo, lo que generó errores y pérdida de tiempo.Cuando nos cansamos (muy rápidamente), decidimos llamar a DevOps para ayudar. Pero aún así, tomó tiempo y no hubo más esfuerzo para editar la configuración a mano. Luego se me ocurrió e implementé una solución bastante rápida, de la que quiero hablar en este artículo.



Aquí están nuestras condiciones iniciales:



  1. Nuestro servicio es la aplicación de consola y, a diferencia de la aplicación web ASP.NET Core, no teníamos una solución lista para usar.
  2. La aplicación se inicia desde el contenedor de la ventana acoplable.


Bueno, descubramos cómo usar la configuración múltiple en una aplicación de consola. Primero, creemos archivos de configuración para nuestros entornos de desarrollo y pruebas:





No hay anidación predeterminada en las aplicaciones de consola. Por lo tanto, abra el archivo de proyecto .csproj y agregue:



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

      
      





Los archivos adjuntos con el nombre del entorno de desarrollo aparecieron en el archivo appsettings.json:







En los archivos appsettings.Dev.json y appsettings.Testing.json, agregue las partes de la configuración que cambian según el entorno. Cambiemos el nombre de los temas de Kafka en el ciclo de prueba de carga agregando los parámetros necesarios a appsettings.Testing.json:



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

      
      





Solo queda seleccionar el archivo appsettings.json deseado durante el inicio del servicio. Para hacer esto, hagamos cambios en la clase 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();
}

      
      





Ahora todo está listo para iniciar el servicio en un contenedor docker.



Queda por especificar las variables de entorno para el contenedor. Hay varias formas de hacer esto:



  • línea de comando
  • Archivo de texto
  • docker componer


Me detuve en especificar variables en la línea de comando. Aquí hay un script de ejemplo para crear una imagen y lanzar un contenedor:



# Build image
# docker build . -t consoleapp

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

      
      





Existen soluciones más elegantes para crear una canalización para su implementación, pero este método se puede implementar en poco tiempo, lo cual es muy crítico en la etapa inicial de creación del proyecto.



Enlace a GitHub con el proyecto .



¡Gracias por su atención y codificación agradable!



All Articles