.net core 为.NET核心工作者服务设置环境名称(生产、开发等)
对于如何为.NET核心员工服务(例如开发、生产等)指定环境变量,然后使用环境变量,我有点困惑 下面是我当前启动的服务,它作为docker容器执行:.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
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