env变量更改后重新加载配置

时间:2019-01-28 23:41:46

标签: c# docker asp.net-core docker-compose

我在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的值”。

问题::是否有任何方法可以在运行时更改环境变量(Log__Type的值(无需重新启动docker容器)并像使用{ {1}}和appsettings.json?

我尝试连接到容器(reloadOnChange)并设置环境变量新值

docker exec

但是我的应用程序没有重新加载配置,并且仍然显示日志类型“ docker-compose中的值”。

您能否建议如何使用docker在运行时更改设置?或解释为什么文件更改后只重新加载,而env变量却没有。

2 个答案:

答案 0 :(得分:4)

  

有什么方法可以在运行时更改env变量的值(无需重启docker容器)

不。 (甚至重启还不够:您需要删除并重新创建容器。)

这遵循普通的Unix模型。一个进程可以为其子进程设置初始环境,但是一旦执行了该子进程,就不再拥有对该环境的控制权。 docker exec在容器名称空间中启动一个新进程,因此,如果您在其中更改环境变量,它将仅影响该进程,而不影响主容器进程。

在最初的docker run命令中,有很多选项只能 设置。这包括环境变量,还包括卷挂载和已发布的端口。重要的是,它还包含基础映像:如果您有新的应用程序生成,或者由于安全问题需要更新基础OS发行版,则将被迫删除并重新创建容器。根据我的经验,docker rm非常常规,您应该计划它定期发生。

答案 1 :(得分:0)

那么您想要做的是在运行时读取文件是否已更改的情况?您可以使用FileSystemWatcher来检测文件的更改或编辑时间,从某种意义上说可以,但是检测天气或特定变量是否已更改有点麻烦,因为您只能检测何时整个文件都有更改,然后检查所需的var是否已更改自己。

FileSystemWatcher MSD

但是,如果我们谈论的是应用程序在运行时接受新的环境更改,则可以使用hacky解决方案,通过使用NamedPipeStream可以发送环境更改,方法是启动另一个进程来告诉主程序将Var X更新为是的,或者像前面提到的那样,但是有一个子进程来检测它并将其发送回溜槽。

NamedPipeStream Server MSD NamedPipeStream Client MSD