首页 > 解决方案 > 来自 Docker 运行命令的环境变量未传递到 .NET Core 控制台应用程序

问题描述

我有一个用 .NET Core 2.1.1 编写的控制台应用程序,我想在 swarm 的 docker 服务中运行它。控制台应用程序需要几个我想通过环境变量传递的输入值。目前,我有以下构建控制台应用程序的 Dockerfile,并将最终图像推送到注册表。

FROM microsoft/dotnet:latest AS builder
WORKDIR /app
COPY MyApp.sln ./MyApp.sln
COPY src/MyApp.Console/*.csproj ./MyApp.Console/
COPY src/MyApp.Core/*.csproj ./MyApp.Core/
COPY src/MyApp.Infrastructure/*.csproj ./MyApp.Infrastructure/
WORKDIR /app/MyApp.Console
RUN dotnet restore MyApp.Console.csproj

WORKDIR /app/
COPY src/MyApp.Console/. ./MyApp.Console/
COPY src/MyApp.Core/. ./MyApp.Core/
COPY src/MyApp.Infrastructure/. ./MyApp.Infrastructure/
WORKDIR /app/MyApp.Console
RUN dotnet publish -c Release -o out

FROM microsoft/dotnet:runtime AS runtime
WORKDIR /app
COPY --from=builder /app/MyApp.Console/out ./
ENTRYPOINT ["dotnet", "MyApp.Console.dll"]

我正在使用来自 Web 服务的 Docker C# API,该服务将拉下图像并将图像作为 swarm 中的服务运行。

但是现在,要在本地测试我正在使用

docker run -i -t my.registry/my-app/my-app/my-app:latest -e "VAL1=test" -e "VAL2=test"

但是当我通过输出环境变量的值时

var var1 = Environment.GetEnvironmentVariable("VAL1");
System.Console.WriteLine($"Variable 1: {var1}");

它是空的。我也尝试过使用内置的 ConfigurationBuilder API,但它也没有返回该环境变量的值:

Configuration = new ConfigurationBuilder()
   .SetBasePath(Directory.GetCurrentDirectory())
   .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
   .AddEnvironmentVariables()
   .Build();

var var1 = Configuration["VAL1"];
System.Console.WriteLine($"Variable 1: {var1}");

但它也不为该变量返回任何内容。当我通过 Dockerfile 添加环境变量时,这些变量是通过上述方法检索的,但这不是一个选项,因为我需要在运行这些图像或将这些图像添加到群时发送输入。

另外需要注意的是,当我在 Docker 容器运行时检查它时,我在输出的 JSON 数据中看到了环境变量,但控制台应用程序似乎看不到它们。我可以从控制台应用程序访问其他环境变量,但我在运行命令中添加的那些不可用。

在这一点上,我不知道该怎么做,因为互联网上的很多例子都说这应该有效。我错过了什么吗?可以从应用程序中获取 docker run 命令中给出的环境变量吗?

标签: docker.net-core

解决方案


参数应该放在图像之前

docker run -i -t -e "VAL1=test" -e "VAL2=test" my.registry/my-app/my-app/my-app:latest 

推荐阅读