为什么在将环境变量传递给docker运行时忽略ASPNETCORE_前缀



当我调用。。。

docker run myImage -e ASPNETCORE_ENVIRONMENT=Development

应用程序中的环境是CCD_ 1。

然而,这会导致环境设置为Development

docker run myImage -e ENVIRONMENT=Development

为什么会这样?这与Visual Studio生成的Compose文件相同。即使在Visual Studio中运行该应用程序,该应用程序也会忽略ASPNETCORE_ENVIRONMENT的值。

ASP.net中有一个选项可以在加载env变量时删除前缀,但它默认为true,我在任何地方都找不到它的设置位置。

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

此处讨论。。。

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

我不确定您的样本出了什么问题——您没有附加Dockerfile
Dockerfile本身应该通过ENV指令声明其环境变量
让我们看看基于dotnet6的空图像:

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

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

  2. 使用默认环境运行容器:

    docker run -d aspnet_env_test:1.0

  3. 使用命令检查环境变量:

    docker exec <containerId> env

就我个人而言,我看到了这个输出:

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. 现在停止,删除容器并基于相同的映像运行新的容器,但使用Production环境:

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

  2. 再次检查新建容器的环境:

    docker exec <containerId> env

我的输出是这样的:

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

所以,我们在这里看到环境被成功地传递到容器文件系统
在您的应用程序中唯一要做的事情-只需调用前面提到的命令即可捕获您的env变量(带或不带前缀参数重载(:

builder.Configuration.AddEnvironmentVariables();

BTW:afaik您可能在环境变量中使用前缀,也可能不使用前缀。但是前缀本身是从env变量名中删除的,所以如果你使用它(没有检查(,你可以从你的应用程序中访问它们,而不需要前缀。

我猜您的错误是在Dockerfile中使用不带前缀的ENV指令。Dockerfile中的名称应该完全匹配。

这很好。

相关内容

最新更新