.net-core - 如何发布 .NET Core Worker Service 以确保它不处于生产模式 (DOTNET_ENVIRONMENT)?
问题描述
我有一个 .NET Core Worker 服务,其中包含一些在开发/暂存和生产之间不同的代码。我了解如何在服务器上设置DOTNET_ENVIRONMENT以进行开发或登台。
在我的 IDE 本地,工作器服务作为 Development 或 Staging 运行,因为DOTNET_ENVIRONMENT在launchSettings.json中设置为Development(或Staging)。但是,当发布到服务器时,此设置将被忽略。
我要防止的是,将来,如果启动新服务器并将其用于我们的 Worker 服务,则代码不会在生产模式下运行(这是默认值,如果环境变量DOTNET_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
推荐阅读
- python - 为什么 Python MySQL 插入表不起作用?
- office-js - 如何知道在 excel 中打开的文件是否已保存?
- mysql - 显示条目是否存在连接
- sql-server - 从 MSSQL 中的日期时间获取 HH:MM:SS
- database - PostgreSQL 中的部分索引何时更新
- java - 如何使 customActionBar 透明并更改其文本颜色?
- ms-word - 使用通配符在 Word 中查找和替换
- laravel - Vue没有根据方法更新计算属性,但是直接调用时相同的方法返回正确的值
- reactjs - 反应:道具未在地图功能内更新
- c++ - 当不应存在子字符串时,具有多个字符的 find_first_of 不返回 string::npos