ASPNETCORE_ENVIRONMENT in Docker

31,021

Solution 1

It works for me by configuring ASPNETCORE_ENVIRONMENT with command dotnet CoreDocker.dll --environment="X"

Try to change dockerfile like below:

ENTRYPOINT ["dotnet", "CoreDocker.dll", "--environment=X"]

Solution 2

In the docker-compose.override.yml file, you should find something like that:

version: '3.4'

services:
  webapplication1:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development # <==

Solution 3

Visual Studio Docker Tooling

In case you use the Docker integration for Visual Studio (debug container from within VS) you need to pay special attention to the defaults.

Default Environment Variables

When the tooling is starting the debugger with a docker run [..] command, it supplies an -e "ASPNETCORE_ENVIRONMENT=Development" argument. You can overwrite this environment variable in the Properties/launchSettings.json.

Even though I can't see it in the issued command, in my testing I experienced another default variable ASPNETCORE_URLS=http://+:80 as well.

A good starting point to read about VS Docker Tooling is this blog post and the official documentation.

.Net-Core 3.0 Generic Host

When you use the generic host in .Net-Core 3.0 you might encounter issues when you use the new generic DOTNET_ENVIRONMENT variable, since you will have two environments specified then. This can be hard to debug. So what I like to do is to unset all defaults initially and start fresh in my Properties/launchSettings.json:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "Docker": {
      "commandName": "Docker",
      "environmentVariables": {
        // Overwrite default VS Docker Tools environment variables first (ASPNETCORE_ENVIRONMENT=Development; ASPNETCORE_URLS=http://+:80)
        // https://www.paraesthesia.com/archive/2019/06/18/tips-on-container-tools-for-visual-studio/
        "ASPNETCORE_ENVIRONMENT": "",
        "ASPNETCORE_URLS": "",
        "DOTNET_ENVIRONMENT": "Production",
        "DOTNET_URLS": "http://+:80"
      }
    }
  }
}

Solution 4

Thanks for your comments, I solved my issue. It was just my mistake.

My problem was that when I added Docker-Support to my project I already had a Dockerfile included in the project.

When VS generated files for Docker-support, there was a second Dockerfile created, and one of the Dockerfiles was renamed to "Dockerfile.original".

I was using the "Dockerfile" visible in the solution explorer (which was somehow mapped to the "Dockerfile.original" file in the filesystem)

It seems that in the background my changes where written to "Dockerfile.original" but this file wasn't used while docker-compose was running. It used the empty generated Dockerfile that wasn't visible in the Solution explorer.

Share:
31,021
Aaron
Author by

Aaron

Updated on July 09, 2022

Comments

  • Aaron
    Aaron almost 2 years

    i have problems setting the ASPNETCORE_ENVIRONMENT variable running my project in a docker container. The problem is that the value is always set/overwritten to "Development".

    I have tried setting the environment variable in my Dockerfile using

    ENV ASPNETCORE_ENVIRONMENT test
    

    also tried setting the environment variable in my docker-compose file using

    environment:
          - ASPNETCORE_ENVIRONMENT=test
    

    When I set any other environment variable it works, for example:

    environment:
          - OTHER_TEST_VARIABLE=test
    

    I assume that the value for ASPNETCORE_ENVIRONMENT variable is overwritten somewhere but I have difficulties finding out where.

    I have added Docker support to an existing project and am running the project directly via Visual Studio's Docker/Docker compose option

    The project runs on Asp Net Core 2.1

    Thanks in advance

    My launchSettings.json:

    {
      "iisSettings": {
        "windowsAuthentication": false,
        "anonymousAuthentication": true,
        "iisExpress": {
          "applicationUrl": "http://localhost:53183/",
          "sslPort": 0
        }
      },
      "profiles": {
    
        "Docker": {
          "commandName": "Docker",
          "launchBrowser": true,
          "launchUrl": "{Scheme}://localhost:{ServicePort}/api/values"
    
        }
    
      }
    }
    

    I also tried adding the environment variable configuration to the launchSettings.json

    "Docker": {
              "commandName": "Docker",
              "launchBrowser": true,
              "launchUrl": "{Scheme}://localhost:{ServicePort}/api/values",
              "environmentVariables": {
               "ASPNETCORE_ENVIRONMENT": "test"
          }
            }
    

    My Webhost:

     public static IWebHost BuildWebHost(string[] args)
            {
               return WebHost.CreateDefaultBuilder(args)
                    .ConfigureAppConfiguration((builderContext,config) =>
                    {
                        config.AddEnvironmentVariables();
                    })
                    .ConfigureLogging((hostingContext, logging) =>
                    {
                        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                        logging.AddConsole();
                        logging.AddDebug();
                    })
                    .UseStartup<Startup>()
                    .Build();
    
            }
    

    My docker-compose.yml

    version: '3.4'
    
    services:
      api:
        image: ${DOCKER_REGISTRY}api
        build:
          context: .
          dockerfile: API/Dockerfile
        environment:
         - ASPNETCORE_ENVIRONMENT=test 
    

    My Dockerfile:

    FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
    
    WORKDIR /app
    EXPOSE 80
    FROM microsoft/dotnet:2.1-sdk AS build
    WORKDIR /src
    COPY API/API.csproj API/
    RUN dotnet restore API/API.csproj
    COPY . .
    WORKDIR /src/API
    RUN dotnet build API.csproj -c Release -o /app
    
    FROM build AS publish
    RUN dotnet publish API.csproj -c Release -o /app
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app .
    
    
    ENTRYPOINT ["dotnet", "API.dll"]
    

    Here is a list of the environment variables in the container

    C:\Users\Administrator>docker exec -ti d6 /bin/bash
    root@d6f26d2ed2c3:/app# printenv
    HOSTNAME=d6f26d2ed2c3
    ASPNETCORE_URLS=http://+:80
    test1=asdasd
    test2=dasdasd
    test3=dasdasd
    PWD=/app
    HOME=/root
    NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages
    DOTNET_USE_POLLING_FILE_WATCHER=1
    ASPNETCORE_VERSION=2.1.3
    DOTNET_RUNNING_IN_CONTAINER=true
    TERM=xterm
    SHLVL=1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    ASPNETCORE_ENVIRONMENT=Development
    _=/usr/bin/printenv
    root@d6f26d2ed2c3:/app#
    
  • Lee Gary
    Lee Gary over 4 years
    It worked for me when I did this too, but I looked harder and realised that I had 2 sets of environment values set, merging them into one worked fine after that
  • Javid
    Javid over 3 years
    Saved my life just like that. yeah.