Невозможно получить переменную ASPNETCORE_ENVIRONMENT в контейнере Docker

У меня есть веб-приложение .netcore, которое отлично работает на моей машине. Я хочу запустить его в докер-контейнере.

Я пытаюсь установить переменную среды ASPNETCORE_ENVIRONMENT, но в коде, который ее читает, значение всегда равно нулю.

const string environmentVariableName = "ASPNETCORE_ENVIRONMENT";
var environmentName = Environment.GetEnvironmentVariable(environmentVariableName);

if (string.IsNullOrEmpty(environmentName))
{
    //I'm only doing this is I can be certain that the environment variable isn't being retrieved
    environmentName = "Error: UNABLE TO DETERMINE THE VALUE OF ASPNETCORE_ENVIRONMENT";
}

Я добавил различные версии файла докеров ниже, это моя текущая попытка. У меня есть аргумент со значением по умолчанию, который устанавливается как переменная среды:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

ARG ASPNETCORE_ENVIRONMENT="dev"
ENV ASPNETCORE_ENVIRONMENT=$ASPNETCORE_ENVIRONMENT

RUN echo $ASPNETCORE_ENVIRONMENT

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "Zankre.dll"]

Я также попытался передать переменную с помощью команды ENTRYPOINT, как это делали некоторые другие вопросы о переполнении стека:

ENTRYPOINT ["dotnet", "Zankre.dll", "--environment=dev"]

Я также попытался передать аргументы как часть команды docker build и команды docker run. Я просто не могу получить переменную окружения, она всегда равна нулю.

Это команды сборки / запуска докера:

docker build -t zankre .
docker run -p 8080:80 zankre

Я использую переменную ASPNETCORE_ENVIRONMENT, чтобы задать используемый файл appsettings.xxx.json, где xxx - значение ASPNETCORE_ENVIRONMENT.

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

При использовании ConfigurationBuilder над приложением происходит сбой, и контейнер закрывается. Я вижу ошибку, заключающуюся в том, что файл не существует, и сообщение «Ошибка: НЕВОЗМОЖНО ОПРЕДЕЛИТЬ ЗНАЧЕНИЕ ASPNETCORE_ENVIRONMENT», подтверждающее, что запрос переменной среды вернул значение null.

Если я сделаю файл appsettings необязательным, приложение будет работать в контейнере, я вижу домашнюю страницу, но умираю, когда пытается использовать одну из настроек из файла appsettings.

Я могу использовать контейнеры Linux только в Docker из-за моей версии Windows. Я не знаю, имеет ли это значение?

Судя по всему, что я прочитал, большинство попыток, которые я сделал, должны были сработать. Что я делаю неправильно?


person Percy    schedule 02.02.2021    source источник
comment
Вы решили проблему?   -  person Dennis Spade    schedule 16.04.2021
comment
Мне удалось заставить его использовать переданную переменную - обновлю с ответом ниже   -  person Percy    schedule 16.04.2021
comment
Я добавил переменную env в файл докера непосредственно перед командой dotnet - у меня она работает, но я до сих пор не понимаю, почему переменная env из аргумента недоступна в файле Program.cs и доступна в Startup.cs   -  person Dennis Spade    schedule 16.04.2021


Ответы (1)


После многих проб и ошибок я понял, что неправильно формировал команду запуска докера - и я не могу найти какую-либо документацию по этому поводу, но вам нужно иметь переменные перед тегом контейнера, например

В строке ниже ASPNETCORE_ENVIRONMENT не использовался

docker run -p 8080:80 zankre -e "ASPNETCORE_ENVIRONMENT=Development"

Переменная ДОЛЖНА быть указана перед тегом контейнера. Ниже сработало, как я ожидал

docker run -e "ASPNETCORE_ENVIRONMENT=Development" -p 8080:80 zankre
person Percy    schedule 16.04.2021