我在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变量却没有。
答案 0 :(得分:4)
有什么方法可以在运行时更改env变量的值(无需重启docker容器)
不。 (甚至重启还不够:您需要删除并重新创建容器。)
这遵循普通的Unix模型。一个进程可以为其子进程设置初始环境,但是一旦执行了该子进程,就不再拥有对该环境的控制权。 docker exec
在容器名称空间中启动一个新进程,因此,如果您在其中更改环境变量,它将仅影响该进程,而不影响主容器进程。
在最初的docker run
命令中,有很多选项只能 设置。这包括环境变量,还包括卷挂载和已发布的端口。重要的是,它还包含基础映像:如果您有新的应用程序生成,或者由于安全问题需要更新基础OS发行版,则将被迫删除并重新创建容器。根据我的经验,docker rm
非常常规,您应该计划它定期发生。
答案 1 :(得分:0)
那么您想要做的是在运行时读取文件是否已更改的情况?您可以使用FileSystemWatcher来检测文件的更改或编辑时间,从某种意义上说可以,但是检测天气或特定变量是否已更改有点麻烦,因为您只能检测何时整个文件都有更改,然后检查所需的var是否已更改自己。
但是,如果我们谈论的是应用程序在运行时接受新的环境更改,则可以使用hacky解决方案,通过使用NamedPipeStream可以发送环境更改,方法是启动另一个进程来告诉主程序将Var X更新为是的,或者像前面提到的那样,但是有一个子进程来检测它并将其发送回溜槽。