首页 > 解决方案 > 如何发布 .NET Core Worker Service 以确保它不处于生产模式 (DOTNET_ENVIRONMENT)?

问题描述

我有一个 .NET Core Worker 服务,其中包含一些在开发/暂存和生产之间不同的代码。我了解如何在服务器上设置DOTNET_ENVIRONMENT以进行开发或登台。

在我的 IDE 本地,工作器服务作为 Development 或 Staging 运行,因为DOTNET_ENVIRONMENT在launchSettings.json中设置为Development(或Staging)。但是,当发布到服务器时,此设置将被忽略。

我要防止的是,将来,如果启动新服务器并将其用于我们的 Worker 服务,则代码不会在生产模式下运行(这是默认值,如果环境变量DOTNET_ENVIRONMENT不存在)。现在,防止它的唯一方法是设置环境变量,我不想指望启动新服务器的人必须设置这个变量。这个问题有解决方案吗?

标签: .net-coreenvironment-variablesproduction-environment

解决方案


要进行此更改,重要的是要准确了解您要部署到哪种类型的环境,您的应用程序是 Dockerized/Containerized 还是直接部署在服务器上。这些用于使应用程序在多个环境中工作的配置中的大多数都需要在构建管道中进行额外配置才能自动实现。

如果您的应用程序在 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

可以在此处找到注入环境变量的其他信息:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-5.0


推荐阅读