Задание имени среды (Production, Development et c) для. NET Core Worker Service - PullRequest
0 голосов
/ 15 апреля 2020

Я немного сбит с толку относительно того, как указать - а затем использовать - переменную среды для. 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. Как видите, переменная подбирается во время выполнения:

enter image description here

Я также пытался установить ее в конфигурации отладки проекта:

enter image description here

Я даже пытался добавить переменную в качестве переменной ENV непосредственно в DockerFile. Ничто не похоже на работу. Очевидно, я не понимаю, как установить это правильно и был бы признателен за некоторые советы. Я хочу использовать переменную окружения, чтобы контролировать, использовать ли AWS Access и секретный ключ при запуске. Если в разработке, используйте их, если в производстве нет и просто полагаться на роль IAM.

1 Ответ

0 голосов
/ 15 апреля 2020

Когда вы запускаете контейнер docker, используя docker run ..., вы задаете переменные среды следующим образом: -e ASPNETCORE_ENVIRONMENT=$environment.

Затем вы можете exec в свой контейнер, чтобы увидеть, правильно ли установлена ​​переменная среды. например,

docker exec -it container_name /bin/bash

, а затем echo $ASPNETCORE_ENVIRONMENT

В приложении do tnet вы можете получить переменную окружения, используя Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")

- Follow up edit -

Вы можете установить переменные среды отладки в окне свойств проекта в разделе Debug . enter image description here

Это обновляет Properties / launchSettings. json enter image description here

Что касается второго вопроса, я не слишком знакомы с Env.IsEnvironment, но здесь есть некоторая документация . Интересно, что в документации используется не stati c Env из HostingEnvironmentExtensions, а скорее параметр функции в Startup Configure.

Если у вас возникли проблемы; вот шаги, которые я бы сделал:

  1. Подтвердите, что переменная окружения правильно устанавливается в контейнере, выполнив команду c 'в контейнере.
  2. Use Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") in do tnet core.
  3. Переключение на Env.IsEnvironment.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...