【问题标题】:Setting environment name (Production, Development etc) for .NET Core Worker Service为 .NET Core Worker 服务设置环境名称(生产、开发等)
【发布时间】:2020-04-15 09:17:30
【问题描述】:

对于如何指定 - 然后使用 - .NET Core 工作服务(例如开发、生产等)的环境变量,我有点困惑。

这是我当前启动的服务,它作为 docker 容器执行:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.IO;
using System.Reflection;
using Amazon.SQS;
using Amazon.Extensions.NETCore.Setup;
using Microsoft.Extensions.Configuration;

namespace WorkerServiceDocker
{
    public class Program
    {
        protected static IHostEnvironment Env { get; }

        public static void Main(string[] args)
        {
            Session.InstanceGuid = Guid.NewGuid().ToString();
            Session.AwsAccessKey = Environment.GetEnvironmentVariable("AWS_ACCESS_KEY_ID");
            Session.AwsSecretKey = Environment.GetEnvironmentVariable("AWS_SECRET_ACCESS_KEY");

            File.Create("init.log").Close();
            var logWriter = new StreamWriter("init.log");
            logWriter.WriteLine("Assembly Path: " + Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));          
            logWriter.WriteLine($"Session Guid: {Session.InstanceGuid}");
            logWriter.WriteLine($"Container DateTime: {DateTime.Now}");
            logWriter.WriteLine($"Access: {Session.AwsAccessKey}");
            logWriter.WriteLine($"Secret: {Session.AwsSecretKey}");
            if (Env.IsEnvironment("development"))
            {
                logWriter.WriteLine($"DEV ENVIRONMENT");
            }
            else if (Env.IsEnvironment("production"))
            {
                logWriter.WriteLine($"PRODUCTION ENVIRONMENT");
            }
            logWriter.Dispose(); 
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    //var options = hostContext.Configuration.GetAWSOptions();
                    services.AddDefaultAWSOptions(hostContext.Configuration.GetAWSOptions());
                    services.AddHostedService<Worker>();
                    services.AddSingleton<ILogger, Logger>(); // Using my own basic wrapper around NLog for the moment, pumped to CloudWatch.
                    services.AddAWSService<IAmazonSQS>();
                });
    }
}

运行时,我在这一行得到“值不能为空”:

        if (Env.IsEnvironment("development"))

如果我尝试 Env.IsDevelopment() 等等,我会得到相同的“值不能为空”。我的印象是环境变量是使用 ASPNETCORE_ENVIRONMENT 设置的,所以我尝试通过以下方式进行设置:

在 settings.env 文件中作为 ASPNETCORE_ENVIRONMENT=Development。如您所见,该变量在运行时被拾取:

我也尝试在项目的调试配置中设置它:

我什至尝试将变量作为 ENV 变量直接添加到 DockerFile。似乎没有任何效果。显然,我不明白如何正确设置它,并希望得到一些建议。我想使用环境变量来控制启动时是否使用 AWS Access 和 Secret key。如果在开发中,请使用它们,如果在生产中,则不要并且仅依赖 IAM 角色。

【问题讨论】:

    标签: .net-core environment-variables worker


    【解决方案1】:

    当您使用 docker run ... 运行 docker 容器时,您可以按如下方式指定环境变量 -e ASPNETCORE_ENVIRONMENT=$environment

    然后您可以exec 进入您的容器以查看环境变量是否已正确设置,例如

    docker exec -it container_name /bin/bash
    

    然后echo $ASPNETCORE_ENVIRONMENT

    在您的 dotnet 应用程序中,您可以使用 Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") 获取环境变量

    --后续编辑--

    您可以在项目属性窗口的Debug下设置调试环境变量。

    这会更新 Properties/launchSettings.json

    至于第二个问题,我对Env.IsEnvironment不太熟悉,但是有一些文档here。有趣的是,文档没有使用 HostingEnvironmentExtensions 中的静态 Env,而是使用 Startup Configure 中的函数参数。

    如果您遇到一些问题;这是我要做的步骤:

    1. 确认环境变量被设置在 通过在容器中执行正确的容器。
    2. 在中使用Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") dotnet 核心。
    3. 切换到Env.IsEnvironment

    【讨论】:

    • 谢谢瑞恩。当我通过按下 Visual Studio 中的“Docker”按钮在 Visual Studio 中调试容器时,IDE 在后台执行了很多“魔术”来自动生成 docker build、run 和 exec 命令。你知道用你指定的 -e 之类的额外标志来覆盖它的方法吗?
    • 此外,如果像 Env.IsEnvironment("development") 这样的命令没有从我上面设置的众多位置之一提升环境变量,它是如何工作的?
    猜你喜欢
    • 2015-11-06
    • 2015-04-04
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2020-02-05
    • 2020-02-29
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多