我正在尝试确定环境,所以我知道要读取哪个appsettings.json文件。
我有下面的代码,对于Googling而言,这似乎是实现此目标的公认方法(如果有更好的方法,我很乐于考虑其他方法来实现此目标?):>
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", EnvironmentVariableTarget.Machine);
Console.WriteLine($"Environment: {environmentName}");
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false, true)
.AddJsonFile($"appsettings.{environmentName}.json", false, true)
.AddEnvironmentVariables();
_configuration = builder.Build();
上面的代码在本地运行时效果很好,可以从系统变量中获取值:
但是,如果我在docker容器中运行该应用,则environmentName
为空。
如何在docker中设置环境变量?
我尝试了几种方法来实现这一目标,但没有一种能达到预期的效果:
在我的dockerfile中,我拥有:
ENTRYPOINT ["dotnet", "out/myapp.dll","--environment=test"]
我还试图在运行容器时将其作为参数传递:
docker run -e ASPNETCORE_ENVIRONMENT=test --rm dotnetapp-dev
在上面的最后一个示例中,我确实注意到,我可以在构建完配置后通过调用此代码来获取参数,但为时已晚-在调用Build()
之前我需要它:
_configuration = builder.Build();
Console.WriteLine(_configuration["ASPNETCORE_ENVIRONMENT"]);//this works
有人能在Docker容器中实现设置系统变量的功能吗?
答案 0 :(得分:1)
由于@Kalten,我设法获得了一个可行的解决方案-看起来很容易看代码,但要获得它有点痛苦:
const string environmentVariableName = "ASPNETCORE_ENVIRONMENT";
var environmentName = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Machine);
if (string.IsNullOrEmpty(environmentName))
{
//this is required for docker
environmentName = Environment.GetEnvironmentVariable(environmentVariableName);
}
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false, true)
.AddJsonFile($"appsettings.{environmentName}.json", false, true)
.AddEnvironmentVariables();
_configuration = builder.Build();
这行是我在本地运行时获取系统变量的唯一方法,但这不适用于docker:
var environmentName = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Machine);
这行是我在docker中运行时获取系统变量的唯一方法,但这在本地不起作用:
var environmentName = Environment.GetEnvironmentVariable(environmentVariableName);
我必须同时使用这两种方法environmentName
,并在第一种方法之后检查是否为null。不是理想的,但是它可以工作,当我似乎无法从docker得到任何东西时,我不必重命名appsettings.json文件,这是我的选择之一。
因此在docker中,我可以将变量作为参数传递:docker run -e ASPNETCORE_ENVIRONMENT=Staging --rm dotnetapp-dev
,也可以将变量放入dockerfile中:
FROM microsoft/dotnet:2.1-sdk
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT=Regression
//other stuff here