我有一个用.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,它将下拉图像并将图像作为服务内部的服务运行。
但是现在,我正在使用本地测试
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添加环境变量时,通过上面的方法检索变量,但这不是一个选项,因为我需要在运行这些图像或添加到swarm的运行时期间发送输入。
另外需要注意的是,当我在运行时检查Docker容器时,我在输出JSON数据中看到了环境变量,但似乎控制台应用程序看不到它们。我可以从控制台应用程序访问其他环境变量,但是我在run命令中添加的变量不可用。
在这一点上,我不知所措,因为互联网上有很多例子说这应该有用。我错过了什么吗?可以从应用程序中获取docker run命令中给出的环境变量吗?
用于传递环境变量的Docker命令应该是这样的:
docker run -i -t my.registry/my-app/my-app/my-app:latest -e VAL1='test' -e VAL2='test'
参数应该出现在图像之前:
docker run -i -t -e "VAL1=test" -e "VAL2=test" my.registry/my-app/my-app/my-app:latest