Не може да се получи променлива 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 -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, потвърждаващо заявката за променливата на средата върна нула.

Ако направя файла с 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 към docker файла точно преди командата dotnet - работи за мен, но все още не разбирам защо променливата env от аргумента не е налична във файла Program.cs и е налична в Startup.cs   -  person Dennis Spade    schedule 16.04.2021


Отговори (1)


След много проби и грешки разбрах, че не формирам командата си за изпълнение на docker правилно - нито мога да намеря документация за това конкретно, но трябва да имате променливите преди маркера на контейнера, напр.

В реда по-долу 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