Я немного сбит с толку относительно того, как указать - а затем использовать - переменную среды для. NET Основной рабочей службы (например, Development, Production et c).
Вот мой текущий запуск для службы, которая выполняется как 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 и секретный ключ при запуске. Если в разработке, используйте их, если в производстве нет и просто полагаться на роль IAM.