问题描述
我有一个.NET Core Worker Service,其中的某些代码在开发/登台与生产之间有所不同。我了解如何set DOTNET_ENVIRONMENT on the server进行开发或登台。
在我的IDE本地,Worker Service作为Development或Staging运行,因为 DOTNET_ENVIRONMENT 在 launchSettings.json 。但是,当发布到服务器时,此设置将被忽略。
我要防止的是将来,如果启动了一个新服务器并将其用于我们的Worker Services,则该代码不会在生产模式下运行(如果环境变量,这是默认模式) DOTNET_ENVIRONMENT 不存在)。目前,防止这种情况发生的唯一方法是设置环境变量,我不想指望动新服务器的人必须设置此变量。有解决这个问题的方法吗?
解决方法
要进行此更改,准确了解您要部署到的环境类型非常重要,无论您的应用程序是 Docker 化/容器化还是直接部署在服务器上。 大多数用于使应用程序在多个环境中工作的配置最需要在构建管道中进行额外配置,以使其自动发生。
如果您的应用程序在 docker 容器中运行,您可能还希望对 Dockerfile 进行以下更改,以便能够使用正确的 env 变量更新在容器中运行的应用程序
FROM mcr.microsoft.com/dotnet/runtime:5.0-buster-slim AS base
ARG DOTNET_ENVIRONMENT
CMD echo $DOTNET_ENVIRONMENT
WORKDIR /app
ENV DOTNET_ENVIRONMENT=$DOTNET_ENVIRONMENT
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["Worker/Worker.csproj","Worker/"]
RUN dotnet restore "Worker/Worker.csproj"
COPY . .
WORKDIR "/src/Worker"
RUN dotnet build "Worker.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Worker.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet","Worker.dll"]
考虑下面的部分,它采用从管道配置中注入的 env 变量并使用它来设置应用程序环境
ARG DOTNET_ENVIRONMENT
CMD echo $DOTNET_ENVIRONMENT
WORKDIR /app
ENV DOTNET_ENVIRONMENT=$DOTNET_ENVIRONMENT
可以在此处找到注入环境变量的其他信息:Sample Output
,您始终可以在代码中对环境变量进行硬编码:
public class Program
{
public static void Main(string[] args)
{
// override env variable before building the host
Environment.SetEnvironmentVariable("DOTNET_ENVIRONMENT","Development");
var host = CreateHostBuilder(args).Build();
var env = host.Services.GetRequiredService<IHostEnvironment>();
Console.WriteLine(env.EnvironmentName); // outputs "Development"
host.Run();
}
// ...
}