Перезагрузить конфигурацию после изменения переменной env - PullRequest
0 голосов
/ 29 января 2019

В файле Startup.cs у меня есть

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)            
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

Есть файл appsettings.json с конфигурациями.Например:

{
  "Log" : {
     "Type" : "value from appsettings.json"
   }
}

reloadOnChange установлен на true, поэтому, когда я изменяю appsettings.json , я сразу получаю новое значение типа журнала в моей программе.

Но я использую Docker с docker-compose и передаю значение установки переменными env.Мой docker-compose.override.yml файл:

version: '3.7'

services:

  myservice:
    environment:
      ASPNETCORE_ENVIRONMENT: Development
      Log__Type: "value from docker-compose"

Для запуска я использую `docker-compose up.Теперь мое приложение имеет значение «значение из docker-compose» для типа журнала.

Вопрос: Существуют ли способы изменить значение переменной env (Log__Type) во время выполнения (без перезапуска Docker-контейнера) и перезагрузить конфигурацию в моем приложении, как это было сделано с reloadOnChange и appsettings.json?

Я попытался подключиться к контейнеру (docker exec) и установить новое значение переменной env

printenv Log__Type  // -> value from docker-compose
export Log__Type=new value 
printenv Log__Type  // -> new value 

, но мое приложение не перезагрузило конфигурациюи по-прежнему показывает тип журнала "значение из docker-compose".

Не могли бы вы посоветовать, как изменить настройки во время выполнения с помощью Docker?Или объясните, почему перезагрузка происходит только после изменения файла, но не переменной env.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Итак, что вы хотите сделать, это прочитать, изменился ли файл или нет во время выполнения?Вы можете использовать FileSystemWatcher, чтобы обнаружить, когда файл был изменен или отредактирован, так что в некотором смысле вы можете, но обнаружение погоды или изменение определенной переменной немного более грязно, потому что вы сможете обнаружить только когдаво весь файл были внесены изменения, а затем проверьте, изменился ли требуемый var самостоятельно.

FileSystemWatcher MSD

, но если мы говорим о получении приложенияновое изменение среды во время выполнения, вы можете использовать хакерское решение, используя NamedPipeStream, вы можете отправить изменения среды, запустив другой процесс, чтобы сказать основному обновить Var X до Y, или, как упомянуто ранее, но вместо этого обнаружив подпроцесси отправка его обратно по желобу.

NamedPipeStream Server MSD NamedPipeStream Клиент MSD

0 голосов
/ 29 января 2019

Существуют ли способы изменить значение переменной env во время выполнения (без перезапуска Docker-контейнера)

Нет.(И даже перезапуска недостаточно: вам нужно удалить и заново создать контейнер.)

Это соответствует обычной модели Unix.Процесс может установить начальную среду для своего дочернего процесса, но как только он исполняется дочерним процессом, он больше не контролирует среду.docker exec запускает новый процесс в пространстве имен контейнера, и поэтому, если вы измените переменную среды там, это повлияет только на этот процесс, а не на основной процесс контейнера.

Существует значительное количество параметров, которые могут только устанавливается во время начальной команды docker run.Это включает переменные среды, а также включает монтирование томов и опубликованные порты.Крайне важно, что он также включает в себя базовый образ: если у вас когда-либо будет новая сборка вашего приложения или вам необходимо обновить базовый дистрибутив ОС для обеспечения безопасности, вам придется удалить и заново создать свой контейнер.По моему опыту docker rm является чрезвычайно рутинным, и вы должны планировать, чтобы это происходило регулярно.

...