【发布时间】: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