Ian Warburton
Ian Warburton

Reputation: 15666

Why is ASPNETCORE_ prefix ignored when passing environment variables to docker run?

When I call...

docker run myImage -e ASPNETCORE_ENVIRONMENT=Development

... the environment in the app is Production.

This however results in the environment set to Development.

docker run myImage -e ENVIRONMENT=Development

Why is this? It's the same with the Compose file that Visual Studio generates. Even when you run it from Visual Studio, the app ignores the value of ASPNETCORE_ENVIRONMENT.

There's an option within ASP.net to remove the prefix when loading env variables but it defaults to true and I can't find anywhere where it's set.

https://github.com/dotnet/aspnetcore/blob/a450cb69b5e4549f5515cdb057a68771f56cefd7/src/Hosting/Hosting/src/WebHostBuilderOptions.cs

if (!options.SuppressEnvironmentConfiguration)
{
   configBuilder.AddEnvironmentVariables(prefix: "ASPNETCORE_");
}

https://github.com/dotnet/aspnetcore/blob/259ff381eb80b197eb9d9d2421251e3e1edd40ae/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs

Discussed here...

https://github.com/dotnet/aspnetcore/pull/25136

Upvotes: 0

Views: 785

Answers (1)

Ryan
Ryan

Reputation: 746

I am not sure what is wrong with your sample - you did not attach your Dockerfile.
Dockerfile itself should declare its environment variables via ENV directive.
Let's see empty dotnet6-based image:

FROM mcr.microsoft.com/dotnet/sdk:6.0
#dev as default value
ENV ASPNETCORE_ENVIRONMENT=Development
ENTRYPOINT ["bash", "-c", "tail -f /dev/null"]
  1. Build image:

    docker build --no-cache -t aspnet_env_test:1.0 .

  2. Run container with default environment:

    docker run -d aspnet_env_test:1.0

  3. Check environment variable using command:

    docker exec <containerId> env

Personally i see this output:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0af57424ed63
ASPNETCORE_URLS=
DOTNET_RUNNING_IN_CONTAINER=true
DOTNET_VERSION=6.0.1
ASPNET_VERSION=6.0.1
Logging__Console__FormatterName=
DOTNET_GENERATE_ASPNET_CERTIFICATE=false
DOTNET_NOLOGO=true
DOTNET_SDK_VERSION=6.0.101
DOTNET_USE_POLLING_FILE_WATCHER=true
NUGET_XMLDOC_MODE=skip
POWERSHELL_DISTRIBUTION_CHANNEL=PSDocker-DotnetSDK-Debian-11
ASPNETCORE_ENVIRONMENT=Development
HOME=/root
  1. Now stop, remove container and run new one based on the same image, but with the Production environment:

    docker rm -f <containerId> && docker run --rm -d -e ASPNETCORE_ENVIRONMENT=Production aspnet_env_test:1.0

  2. Check again the environment of newly created container:

    docker exec <containerId> env

Mine output is this one:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=ebdaeb19795a
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=
DOTNET_RUNNING_IN_CONTAINER=true
DOTNET_VERSION=6.0.1
ASPNET_VERSION=6.0.1
Logging__Console__FormatterName=
DOTNET_GENERATE_ASPNET_CERTIFICATE=false
DOTNET_NOLOGO=true
DOTNET_SDK_VERSION=6.0.101
DOTNET_USE_POLLING_FILE_WATCHER=true
NUGET_XMLDOC_MODE=skip
POWERSHELL_DISTRIBUTION_CHANNEL=PSDocker-DotnetSDK-Debian-11
HOME=/root

So, we see here that environment is successfully passed to container file system.
The only thing to be done in your app - just call aforementioned command for your env variables to be caught (with or without prefix parameter overload):

builder.Configuration.AddEnvironmentVariables();

BTW: afaik you might or might not use prefix in environment variables. But prefix itself is removed from env variable names, so you get access to them from your app without prefix if you use it (did not check it).

Guess your error was in using ENV directives without prefix in Dockerfile. Names in Dockerfile should match exactly.

That works fine.

Upvotes: 1

Related Questions