Como definir o arquivo de configuração no aplicativo .Net Core Console para vários IDEs ao executar o contêiner Docker

Nossa equipe desenvolveu um serviço de processamento de mensagens da Kafka. Era um aplicativo de console .Net Core que se inscrevia em tópicos, e quando uma mensagem aparecia em cada um deles, realizava um determinado algoritmo de processamento. Nas primeiras iterações do desenvolvimento de nosso serviço, a implantação era bastante simples: publicamos aplicativos, transferimos os arquivos de compilação prontos para o servidor, criamos uma imagem docker e lançamos o serviço em um contêiner. Vivemos assim até que o teste de carga chegou até nós e foi implantado em um circuito vizinho. O arquivo de configuração appsettings.json nesses contornos, é claro, era diferente e tivemos mais uma etapa em nossa implantação - consertar o arquivo de configuração com alças. Nesta fase, o fator humano interveio e às vezes esquecemos de editar o arquivo, o que levou a erros e perda de tempo.Quando nos cansamos (muito rapidamente), decidimos ligar para o DevOps para ajudar. Mesmo assim, demorou e não houve mais esforço para editar a configuração manualmente. Então eu vim com e implementei uma solução bastante rápida, sobre a qual quero falar neste artigo.



Aqui estão nossas condições iniciais:



  1. Nosso serviço é o aplicativo de console e, ao contrário do aplicativo da Web ASP.NET Core, não tínhamos uma solução pronta para uso.
  2. O aplicativo é iniciado a partir do contêiner do docker.


Bem, vamos descobrir como usar a configuração múltipla em um aplicativo de console. Primeiro, vamos criar arquivos de configuração para nossos ambientes de Desenvolvimento e Teste:





Não há aninhamento padrão em aplicativos de console. Portanto, abra o arquivo de projeto .csproj e adicione:



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

      
      





Arquivos anexados com o nome do ambiente de desenvolvimento apareceram no arquivo appsettings.json:







Nos arquivos appsettings.Dev.json e appsettings.Testing.json, adicione as partes da configuração que mudam dependendo do ambiente. Vamos mudar o nome dos tópicos Kafka no loop de teste de carga adicionando os parâmetros necessários a appsettings.Testing.json:



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

      
      





Resta apenas selecionar o arquivo appsettings.json desejado durante o início do serviço. Para fazer isso, vamos fazer alterações na classe do programa:



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

      
      





Agora tudo está pronto para iniciar o serviço em um contêiner docker.



Resta especificar as variáveis ​​de ambiente para o contêiner. Existem várias maneiras de fazer isso:



  • linha de comando
  • arquivo de texto
  • docker compose


Parei de especificar variáveis ​​na linha de comando. Aqui está um script de exemplo para criar uma imagem e executar um contêiner:



# Build image
# docker build . -t consoleapp

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

      
      





Existem soluções mais elegantes para criar um pipeline para sua implantação, mas esse método pode ser implementado em um curto espaço de tempo, o que é muito crítico no estágio inicial da criação do projeto.



Link para GitHub com o projeto .



Obrigado pela sua atenção e codificação agradável!



All Articles