docker - 无法在 Docker 容器中获取 ASPNETCORE_ENVIRONMENT 变量
问题描述
我有一个在我的机器上运行良好的 .netcore webapp。我想让它在 docker 容器中运行。
我正在尝试设置 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";
}
我在下面添加了各种版本的 dockerfile,这是我目前的尝试。我有一个默认设置为环境变量的参数:
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 命令和 docker run 命令的一部分传递。我似乎根本无法获取环境变量,它始终为空。
这些是 docker 构建/运行命令:
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 失败,容器退出。我可以看到文件不存在的错误,以及确认环境变量请求返回 null 的消息“错误:无法确定 ASPNETCORE_ENVIRONMENT 的值”。
如果我将 appsettings 文件设为可选,则该应用程序在容器中运行,我可以看到主页,但是当它尝试使用 appsettings 文件中的设置之一时会死机。
由于我的 Windows 版本,我只能在 Docker 中使用 Linux 容器。不知道这样有没有区别?
从我所做的所有阅读来看,我所做的大部分尝试都应该奏效。我究竟做错了什么?
解决方案
经过大量的试验和错误,我意识到我没有正确地形成我的 docker run 命令 - 我也找不到任何关于此的文档,但你需要在容器标签之前有变量,例如
在下面的行中,没有使用 ASPNETCORE_ENVIRONMENT
docker run -p 8080:80 zankre -e "ASPNETCORE_ENVIRONMENT=Development"
该变量必须在容器标签之前指定。下面的工作符合我的预期
docker run -e "ASPNETCORE_ENVIRONMENT=Development" -p 8080:80 zankre
推荐阅读
- r - 在 R 中查找两个数据帧之间的差异
- c# - 如何保存列表
在 Unity 中便于检索 - javascript - 在 JavaScript 中重构 JSON?
- docker - docker-compose up with cassandra 容器不返回
- c# - 如何避免首先在 EF 代码中插入基于多个字段的重复条目
- r - 与州空间数据框不同,创建县空间数据框会生成单行数据框作为输出
- matplotlib - xlsxwriter:如何加载使用 matplotlib.pyplot 创建的 BytesIO png 文件
- aws-cli - 将 aws cli SES 作为文件附件发送
- php - 无法在 PHP 中输出 JSON 数据数组
- firebase - 基于其他文档的 Firestore 安全规则