Docker中的ASPNETCORE_ENVIRONMENT

时间:2018-09-17 23:18:05

标签: asp.net docker asp.net-core .net-core docker-compose

我在设置 ASPNETCORE_ENVIRONMENT 变量时遇到问题,该变量在 docker容器中运行我的项目。问题在于该值始终被设置/覆盖为“开发”

我尝试使用

Dockerfile 中设置环境变量
ENV ASPNETCORE_ENVIRONMENT test

还尝试使用

在我的 docker-compose 文件中设置环境变量
environment:
      - ASPNETCORE_ENVIRONMENT=test

例如,当我设置其他任何环境变量有效时,

environment:
      - OTHER_TEST_VARIABLE=test

我假设 ASPNETCORE_ENVIRONMENT 变量的值在某处被覆盖,但是我很难找出位置。

我已将Docker支持添加到现有项目中,并通过Visual Studio的Docker / Docker compose选项直接运行该项目

该项目在Asp Net Core 2.1上运行

预先感谢

我的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"

    }

  }
}

我还尝试将环境变量配置添加到launchSettings.json

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

我的虚拟主机:

 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();

        }

我的docker-compose.yml

version: '3.4'

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

我的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"]

这是容器中环境变量的列表

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#

6 个答案:

答案 0 :(得分:6)

通过使用命令ASPNETCORE_ENVIRONMENT配置dotnet CoreDocker.dll --environment="X"来为我工作

尝试如下更改dockerfile

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

答案 1 :(得分:6)

在docker-compose.override.yml文件中,您应该找到类似的内容:

version: '3.4'

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

答案 2 :(得分:0)

感谢您的评论,我解决了我的问题。只是我的错。

我的问题是,当我向项目添加Docker-Support时,我已经在项目中包含了Dockerfile。

当VS生成用于Docker支持的文件时,创建了第二个Dockerfile,并且其中一个Dockerfile被重命名为“ Dockerfile.original”。

我正在使用解决方案资源管理器中可见的“ Dockerfile”(以某种方式映射到文件系统中的“ Dockerfile.original”文件)

似乎在后台我的更改写入了“ Dockerfile.original”,但是在docker-compose运行时未使用此文件。它使用了在解决方案资源管理器中看不到的空生成的Dockerfile。

答案 3 :(得分:0)

Visual Studio Docker工具

如果您使用Visual Studio的Docker集成(VS中的调试容器),则需要特别注意默认值。

默认环境变量

当工具使用docker run [..]命令启动调试器时,它将提供一个-e "ASPNETCORE_ENVIRONMENT=Development"参数。您可以在Properties/launchSettings.json中覆盖此环境变量。

即使在发出的命令中看不到它,在测试中我也遇到了另一个默认变量ASPNETCORE_URLS=http://+:80

this blog postofficial documentation是了解VS Docker工具的一个很好的起点。

.Net-Core 3.0通用主机

在.Net-Core 3.0中使用通用主机时,使用新的通用DOTNET_ENVIRONMENT变量时可能会遇到问题,因为此时将指定两个环境。这可能很难调试。因此,我想做的是先取消所有默认设置,然后在我的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"
      }
    }
  }
}

答案 4 :(得分:0)

我遇到了同样的问题,我使用的是Rider,仅在服务环境部分的docker-compose文件上具有环境变量。

发生了什么事,是因为我的appsettings.Development.json中没有设置 ConnectionStrings ,所以它默认为appsettings.json文件的 ConnectionStrings

在将正确的连接字符串添加到开发json文件后,我使用docker-compose up命令一切正常。希望这也会对某人有所帮助。

答案 5 :(得分:0)

我犯了一个非常愚蠢的错误。

我有 VS 2019,并且在我的项目中添加了 Docker 支持。因此,我的 WebApi 有一个 Dockerfile 和一个 docker-compose 文件。

基本上,我尝试了你们上面说的所有方法,但没有任何效果。

我发现有一个 docker-compose.override.yml 正在设置这些环境变量。希望这对某人有所帮助。