c# - 如何降低 dockerized .Net Core 应用程序的大小?

标签 c# docker .net-core

我通常为此使用 Rider,但出于复制目的,我将使用终端来描述该过程
我创建了一个 .Net 5 Web Api 并希望为其添加 Docker 支持。我试图通过玩一个示例应用程序来了解它。所以使用终端我创建了一个新的 Web Api

mkdir project
cd project
dotnet new sln
dotnet new webapi -o Api
dotnet sln add ./Api
我检查一切都很好
cd Api
dotnet run
call https://localhost:5001/weatherforecast in the browser
close with ctrl + c
在 Api 项目中,我使用此内容创建了一个 Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet
WORKDIR /app
EXPOSE 80
COPY --from=build /app/out .
ENTRYPOINT [ "dotnet", "Rest.dll" ]
我还使用此内容创建了一个 .dockerignore 文件
.git
Dockerfile
bin/
obj/
我正在构建图像
docker build -t api .
当我现在跑
docker images
此图像的大小为 209MB。我想知道这是否是“最佳/正确的方法”,或者我是否可以在 Dockerfile 或 .dockerignore 文件中改进某些内容。
提前致谢

最佳答案

您可以将 Dockerfile 建立在较小的镜像上。在 Microsoft container registry (MCR) here 中搜索可用图像的目录,Linux alpine(5.0-alpine)可能是最轻量级的。请注意,对于其他发行版,可能存在常规和超薄变体,其中常规是 SDK 环境,而超薄是生产环境。
然后,您可以按如下方式构建 Dockerfile,以将 SDK 镜像中的构建输出中的人工制品移动到最终的轻量级部署镜像:

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
WORKDIR /app

# Main build (SDK environment)
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
RUN dotnet restore "webapi.csproj"
COPY . .
WORKDIR "/src/webapi"
RUN dotnet build "webapi.csproj" -c Release -o /app/build

# Publish build outputs to /app dir
FROM build AS publish
RUN dotnet publish "webapi.csproj" -c Release -o /app/publish

# Final deployment image
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "api.dll"]
在我的示例中,我在构建阶段使用了 Debian buster SDK 镜像,在部署阶段使用了 buster slim。

关于c# - 如何降低 dockerized .Net Core 应用程序的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65995452/

相关文章:

c# - 来自 Veracode 的 "Improper Resource Shutdown or Release"错误,为什么?

azure - 源链接将从互联网下载

c# - Winforms 动画背景

c# - 如何在程序集中找到所有类,这些类是通用抽象类的实例并实现某个接口(interface)

c# - Asp.net MVC 路由不匹配某些文件扩展名

php - 在 Alpine 上运行 nginx

docker - 在 docker 容器内运行不受信任的 .net core 应用程序的最佳实践

mysql - 将 SSL 证书添加到 mysql docker 容器

c# - wpf(离线)应用程序 c# 的更新问题

c# - 使用 Canvas 按钮加载场景