Как определить среду при запуске консольного приложения DotNetCore в докере - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь определить среду, чтобы я знал, из какого файла appsettings.json нужно читать.

Ниже приведен код, который, по мнению Google, кажется приемлемым способом достижения этой цели.(Я более чем счастлив рассмотреть другие способы сделать это, если есть более эффективные способы ???):

var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", EnvironmentVariableTarget.Machine);
Console.WriteLine($"Environment: {environmentName}");

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", false, true)
    .AddJsonFile($"appsettings.{environmentName}.json", false, true)
    .AddEnvironmentVariables();

_configuration = builder.Build();

Вышеприведенное прекрасно работает при локальном запуске, получая значение из системных переменных:

System variables

Однако, если я запускаю приложение в контейнере Docker, environmentName пусто.

Как установить переменные средыв докере?

Я пробовал несколько способов добиться этого, но ни один из них не дал желаемого эффекта:

В моем докер-файле у меня было:

ENTRYPOINT ["dotnet", "out/myapp.dll","--environment=test"]

Я такжепопытался передать его в качестве параметра при запуске контейнера:

docker run -e ASPNETCORE_ENVIRONMENT=test --rm dotnetapp-dev

В моем последнем примере выше я заметил, что могу получить параметр, вызвав этот код, ПОСЛЕ того как я создал конфигурацию, но она слишкомпоздно там - мне нужно перед звонком Build():

_configuration = builder.Build();
Console.WriteLine(_configuration["ASPNETCORE_ENVIRONMENT"]);//this works

Кому-нибудь удалось добиться установки системных переменных в контейнере Docker?

1 Ответ

1 голос
/ 08 апреля 2019

Благодаря @Kalten мне удалось найти решение, которое работает - кажется, действительно легко смотреть на код, но было немного трудно добраться до:

const string environmentVariableName = "ASPNETCORE_ENVIRONMENT";
var environmentName = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Machine);
if (string.IsNullOrEmpty(environmentName))
{
    //this is required for docker
    environmentName = Environment.GetEnvironmentVariable(environmentVariableName);
}

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", false, true)
    .AddJsonFile($"appsettings.{environmentName}.json", false, true)
    .AddEnvironmentVariables();

_configuration = builder.Build();

Эта строка - единственный способ получить системные переменные при локальном запуске, но для докера это не работает:

var environmentName = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Machine);

Эта строка - единственный способ получить системные переменные при запуске в Docker, но это не работает локально:

var environmentName = Environment.GetEnvironmentVariable(environmentVariableName);

Мне пришлось получить environmentName, используя оба метода с проверкой на ноль после первого. Не идеально, но это работает, и мне не нужно будет переименовывать файлы appsettings.json, что было одним из моих вариантов, когда мне казалось, что я ничего не могу получить из докера.

Таким образом, в docker я могу передать переменную в качестве аргумента: docker run -e ASPNETCORE_ENVIRONMENT=Staging --rm dotnetapp-dev или я могу поместить переменную в файл docker:

FROM microsoft/dotnet:2.1-sdk
WORKDIR /app

ENV ASPNETCORE_ENVIRONMENT=Regression
//other stuff here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...