[.NET, C#, DevOps] Как установить файл конфигурации в .Net Core Console app для нескольких сред разработки при запуске Docker-контейнера
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Наша команда разрабатывала сервис обработки сообщений из Kafka. Он представлял собой консольное приложение .Net Core, которое подписывалось на топики, и при появлении сообщения в каждом из них выполняло определённый алгоритм обработки. На первых итерациях разработки нашего сервиса развёртывание было устроено довольно просто: мы делали publish приложения, переносили готовые файлы билда на сервер, создавали docker-образ и запускали сервис в контейнере. Мы жили так, пока к нам не пришло нагрузочное тестирование и развернулось в соседнем контуре. Файл конфигурации appsettings.json в этих контурах, естественно, отличался и у нас появился ещё один шаг в нашем деплое — это исправление файла конфигурации ручками. На этом этапе вмешался человеческий фактор, и иногда мы забывали править файл, что приводило к ошибкам и потери времени. Когда нам это сильно надоело (очень быстро), мы решили призвать DevOps на помощь. Но всё же это требовало времени, а править конфиг руками сил больше не было. Тогда я придумала и реализовала довольно быстрое решение, про которое и хочу рассказать в этой статье.
Вот наши начальные условия:
- Наш сервис — это Console Application и в отличии от ASP.NET Core Web Application у нас не было решения из коробки.
- Запуск приложения происходит из docker-контейнера.
Что ж, давайте разберемся, как использовать мульти конфигурацию в консольном приложении. Для начала создадим файлы конфигураций для наших окружений Dev и Testing:
В консольных приложениях нет вложенности по дефолту. Поэтому открываем файл проекта .csproj и добавляем:
<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>
В файле appsettings.json появились вложенные файлы с названием среды разработки:
В файлы appsettings.Dev.json и appsettings.Testing.json добавляем те части конфига, которые меняются в зависимости от среды. Изменим название топиков Kafka в контуре нагрузочного тестирования, для этого добавим нужные параметры в appsettings.Testing.json:
{
"Kafka":
{
"EventMainTopicTitle": "Test_EventMain",
"EventDelayTopicTitle": "Test_EventDelay",
"EventRejectTopicTitle": "Test_EventReject"
}
}
Осталось только выбрать нужный файл appsettings.json во время старта сервиса. Для этого внесем изменения в класс 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();
}
Теперь всё готово к запуску сервиса в docker-контейнере.
Осталось указать переменные окружения для контейнера. Есть несколько способов сделать это:
- командная строка
- текстовый файл
- docker compose
Я остановилась на указании переменных в командной строке. Вот пример скрипта для создания образа и запуска контейнера:
# Build image
# docker build . -t consoleapp
# Run container on Dev
# docker run -d <i>--env ASPNETCORE_ENVIRONMENT=Dev</i> --name app consoleapp
Есть более элегантные решения для создания pipeline вашего развертывания, но зато этот способ можно реализовать за короткое время, что на начальной стадии создания проектов бывает очень критично.
Ссылка на GitHub с проектом.
Спасибо за внимание и приятного кодинга!
===========
Источник:
habr.com
===========
Похожие новости:
- [Системное администрирование, DevOps, Микросервисы, Kubernetes] Вебинар: Что и как мониторить в Kubernetes кластере для снижения MTTR
- [DevOps] Знакомство с типичными примерами использования встроенных функций Terraform (перевод)
- [DevOps, Облачные сервисы, Kubernetes] Как сократить время сборки образов Docker в GitLab CI (перевод)
- [.NET] Когда программисту нечего делать или оптимизируем код при помощи Linq.Expression
- [Разработка веб-сайтов, DevOps, VueJS, Облачные сервисы] Пишем мессенджер на Vue в облаке Amazon (перевод)
- [Разработка игр, C#, Unity, Дизайн игр] Гравитационная комната в Unity 3D
- [Программирование, C#, Графический дизайн] Создание Dockers в Corel Draw
- [Системное администрирование, IT-инфраструктура, Серверное администрирование, DevOps] Сервер Prometheus и TLS (перевод)
- [.NET, Системы сборки] xUnit тестирование в TeamCity
- [Программирование, .NET, Amazon Web Services, C#, DevOps] Nuke: настраиваем сборку и публикацию .NET-проекта
Теги для поиска: #_.net, #_c#, #_devops, #_c#, #_.net_core, #_console_application, #_docker, #_config_files, #_.net, #_c#, #_devops
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 06:29
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Наша команда разрабатывала сервис обработки сообщений из Kafka. Он представлял собой консольное приложение .Net Core, которое подписывалось на топики, и при появлении сообщения в каждом из них выполняло определённый алгоритм обработки. На первых итерациях разработки нашего сервиса развёртывание было устроено довольно просто: мы делали publish приложения, переносили готовые файлы билда на сервер, создавали docker-образ и запускали сервис в контейнере. Мы жили так, пока к нам не пришло нагрузочное тестирование и развернулось в соседнем контуре. Файл конфигурации appsettings.json в этих контурах, естественно, отличался и у нас появился ещё один шаг в нашем деплое — это исправление файла конфигурации ручками. На этом этапе вмешался человеческий фактор, и иногда мы забывали править файл, что приводило к ошибкам и потери времени. Когда нам это сильно надоело (очень быстро), мы решили призвать DevOps на помощь. Но всё же это требовало времени, а править конфиг руками сил больше не было. Тогда я придумала и реализовала довольно быстрое решение, про которое и хочу рассказать в этой статье. Вот наши начальные условия:
Что ж, давайте разберемся, как использовать мульти конфигурацию в консольном приложении. Для начала создадим файлы конфигураций для наших окружений Dev и Testing: В консольных приложениях нет вложенности по дефолту. Поэтому открываем файл проекта .csproj и добавляем: <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> В файле appsettings.json появились вложенные файлы с названием среды разработки: В файлы appsettings.Dev.json и appsettings.Testing.json добавляем те части конфига, которые меняются в зависимости от среды. Изменим название топиков Kafka в контуре нагрузочного тестирования, для этого добавим нужные параметры в appsettings.Testing.json: {
"Kafka": { "EventMainTopicTitle": "Test_EventMain", "EventDelayTopicTitle": "Test_EventDelay", "EventRejectTopicTitle": "Test_EventReject" } } Осталось только выбрать нужный файл appsettings.json во время старта сервиса. Для этого внесем изменения в класс 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(); } Теперь всё готово к запуску сервиса в docker-контейнере. Осталось указать переменные окружения для контейнера. Есть несколько способов сделать это:
Я остановилась на указании переменных в командной строке. Вот пример скрипта для создания образа и запуска контейнера: # Build image
# docker build . -t consoleapp # Run container on Dev # docker run -d <i>--env ASPNETCORE_ENVIRONMENT=Dev</i> --name app consoleapp Есть более элегантные решения для создания pipeline вашего развертывания, но зато этот способ можно реализовать за короткое время, что на начальной стадии создания проектов бывает очень критично. Ссылка на GitHub с проектом. Спасибо за внимание и приятного кодинга! =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 06:29
Часовой пояс: UTC + 5