.net core 为.NET核心工作者服务设置环境名称(生产、开发等)

.net core 为.NET核心工作者服务设置环境名称(生产、开发等),.net-core,environment-variables,worker,.net Core,Environment Variables,Worker,对于如何为.NET核心员工服务(例如开发、生产等)指定环境变量,然后使用环境变量,我有点困惑 下面是我当前启动的服务,它作为docker容器执行: using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Host

对于如何为.NET核心员工服务(例如开发、生产等)指定环境变量,然后使用环境变量,我有点困惑

下面是我当前启动的服务,它作为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>();
                });
    }
}
如果我尝试Env.IsDevelopment()等等,我会得到相同的“值不能为null”。我的印象是,环境变量是使用ASPNETCORE\u environment设置的,因此我尝试了以下方法进行设置:

在settings.env文件中显示为ASPNETCORE_ENVIRONMENT=Development。如您所见,变量是在运行时拾取的:

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


我甚至尝试将变量作为ENV变量直接添加到DockerFile中。似乎什么都不管用。很明显,我不明白如何正确设置,希望能得到一些建议。我想使用环境变量来控制启动时是否使用AWS访问和密钥。如果在开发中,请使用它们;如果在生产中,请不要简单地依赖IAM角色

使用
docker run…
运行docker容器时,指定环境变量如下
-e ASPNETCORE\u environment=$environment

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

docker exec -it container_name /bin/bash
然后
echo$ASPNETCORE\u环境

在您的dotnet应用程序中,您可以使用
environment.GetEnvironmentVariable(“ASPNETCORE\u环境”)

--后续编辑--

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

这将更新Properties/launchSettings.json

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

如果你有一些问题;以下是我要做的步骤:

  • 确认正在中设置环境变量 正确地将容器放入容器中
  • 在中使用
    Environment.GetEnvironmentVariable(“ASPNETCORE\u环境”)
    网络核心
  • 切换到
    Env.IsEnvironment

  • 谢谢你,瑞安。当我在VisualStudio中通过按下VisualStudio中的“Docker”按钮调试容器时,IDE在后台执行了很多“魔术”,自动生成Docker build、run和exec命令。你知道有什么方法可以用你指定的-e这样的额外标志来覆盖它吗?另外,如果像Env.IsEnvironment(“development”)这样的命令没有从我上面设置的许多地方之一提升环境变量,它是如何工作的?
    docker exec -it container_name /bin/bash