在Docker中运行DotNetCore控制台应用程序时如何确定环境

时间:2019-04-06 08:59:39

标签: docker .net-core console-application

我正在尝试确定环境,所以我知道要读取哪个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();

上面的代码在本地运行时效果很好,可以从系统变量中获取值:

System variables

但是,如果我在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容器中实现设置系统变量的功能吗?

1 个答案:

答案 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