我正在Docker中运行.NET Core应用程序(在Kubernetes中),将环境变量传递给Docker容器并在我的应用程序中使用它们。
在我的.NET Core应用程序中,我有以下C#类:
margin-top:-170px;
我设置了我的public class EnvironmentConfiguration
{
public string EXAMPLE_SETTING { get; set; }
public string MY_SETTING_2 { get; set; }
}
:
appsettings
DI设置:
config.
AddJsonFile("appsettings.json").
AddJsonFile($"appsettings.docker.json", true).
AddEnvironmentVariables();
在我的控制器中,我使用它:
services.Configure<EnvironmentConfiguration>(Configuration);
我跑码头:
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/my")]
public class MyController : Controller
{
private readonly IOptions<EnvironmentConfiguration> _environmentConfiguration;
public MyController(IOptions<EnvironmentConfiguration> environmentConfiguration)
{
_environmentConfiguration = environmentConfiguration;
}
}
文件docker run -p 4000:5000 --env-file=myvariables
如下所示:
myvariables
这很有效。我可以使用我的EXAMPLE_SETTING=example!!!
MY_SETTING_2=my-setting-2!!!!
并查看我的变量已设置。
然而......我想将环境变量与appsettings合并,以便在找不到环境变量时将appsettings的值用作回退。以某种方式合并这两行:
_environmentConfiguration
这有可能吗?
我的后备计划是从services.Configure<EnvironmentConfiguration>(settings => Configuration.GetSection("EnvironmentConfiguration").Bind(settings));
services.Configure<EnvironmentConfiguration>(Configuration);
类继承并使用单独的DI来注入两个单独的配置,然后合并它们&#34;手动&#34;在代码中,但这种解决方案是不可取的。
答案 0 :(得分:13)
config.
AddJsonFile("appsettings.json").
AddJsonFile($"appsettings.docker.json", true).
AddEnvironmentVariables();
实际上足以使用环境变量覆盖appsettings值。
假设您在appsettings.json文件中有以下内容;
{
"Logging": {
"Level": "Debug"
}
}
您可以通过将环境可变“Logging:Level”设置为其他值来覆盖Logging.Level
的值。
请注意,:
用于指定环境变量键中的嵌套属性。
来自docs;
如果冒号(:)无法在系统上的环境变量中使用,请将冒号(:)替换为双下划线(__)。