在這容器化的世界里,我們已經很少直接通過檔案發布來運行asp.net core程式了,現在大多數情況下,我們都會使用docker來運行程式,在使用docker之前,我們往往需要打包我們的應用程式,asp.net core程式的鏡像打包,網上有很多教程,其中大多數是使用sdk這個鏡像來直接打包,打出來的包有好幾百MB,3.1 SDK打出來的包甚至超過了1GB,那么有什么辦法來縮小我們打出來的鏡像嗎?最小能縮小到多少呢?這篇文章就來介紹下如何縮小asp.net core 打包出來鏡像的大小,
新建asp.net core 程式

新建一個asp.net core應用程式,用來演示打包,首先我們演示下如果使用dotnet sdk5.0來打包 docker 鏡像,
sdk:5.0
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app
COPY /. /app
RUN dotnet restore -s https://nuget.cdn.azure.cn/v3/index.json
WORKDIR /app/CoreDockerImageSizeTest
RUN dotnet publish -o ./out -c Release
EXPOSE 5000
ENTRYPOINT ["dotnet", "out/CoreDockerImageSizeTest.dll"]
在專案根目錄下新建一個Dockerfile檔案,檔案內容如上,這個Dockerfile比較簡單,使用dotnet sdk:5.0最為底層包來構建,這也是最傻瓜的打包方式,那么看看這個鏡像打出來有多大吧,
docker build . -t coredockerimagesizetest_0.1
使用docker build命令進行打包,
REPOSITORY TAG IMAGE ID CREATED SIZE
coredockerimagesizetest_0.1 latest 14aea8e0c1d5 5 seconds ago 643MB
使用docker images命令來查看鏡像串列,我們發現我們打出來的鏡像居然有643MB,真的很大,如果是內網還好一點,如果在鏡像存在docker hub等第三方倉庫,這得下半天,顯然這個鏡像太大了,接下來看我們如何進行優化,
sdk:5.0-buster-slim
最新的VisualStudio內置了docker工具,可以自動為我們生成Dockerfile檔案,我們來看看它生成的鏡像檔案有多大,

右鍵解決方案=>添加=>Docker支持=>Linux ,
選擇完成后VS會為我們自動添加一個Dockerfile在根目錄,
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 5000
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["CoreDockerImageSizeTest/CoreDockerImageSizeTest.csproj", "CoreDockerImageSizeTest/"]
RUN dotnet restore "CoreDockerImageSizeTest/CoreDockerImageSizeTest.csproj"
COPY . .
WORKDIR "/src/CoreDockerImageSizeTest"
RUN dotnet build "CoreDockerImageSizeTest.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "CoreDockerImageSizeTest.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "CoreDockerImageSizeTest.dll"]
這個自動生成的Dockerfile使用了sdk:5.0-buster-slim這個鏡像進行build跟publish,使用aspnet:5.0-buster-slim這個runtime級別的鏡像做為final底包,從名字來看,很明顯slim代表著輕量,讓我們試試這個Dockerfile打出來的包有多大,
REPOSITORY TAG IMAGE ID CREATED SIZE
coredockerimagesizetest_0.2 latest 0a24618f6ece 11 seconds ago 210MB
使用docker build命令進行打包,使用docker images命令查看鏡像的大小,這個鏡像的大小為210MB,果然比上面的鏡像小了很多,那么是否還能繼續縮小鏡像的大小呢?繼續往下看,
5.0-alpine
除了使用buster-slim鏡像,我們還可以選擇更加小巧的alpine鏡像來打包,alpine鏡像是繼續alpine linux創建的鏡像,所以它更加輕量級更加小巧,
關于alpine linux可以查看這篇:Alpine Linux 與 CentOS 有什么區別? ,
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base
WORKDIR /app
EXPOSE 5000
FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /src
COPY ["CoreDockerImageSizeTest/CoreDockerImageSizeTest.csproj", "CoreDockerImageSizeTest/"]
RUN dotnet restore "CoreDockerImageSizeTest/CoreDockerImageSizeTest.csproj"
COPY . .
WORKDIR "/src/CoreDockerImageSizeTest"
RUN dotnet build "CoreDockerImageSizeTest.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "CoreDockerImageSizeTest.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "CoreDockerImageSizeTest.dll"]
修改Dockerfile使用aspnet:5.0-alpine及sdk:5.0-alpine來構建這個鏡像,
REPOSITORY TAG IMAGE ID CREATED SIZE
coredockerimagesizetest_0.3 latest db34d613e21a 12 seconds ago 108MB
使用docker build命令進行打包,使用docker images命令查看鏡像的大小,這個鏡像的大小為108MB,現在這個鏡像已經比我們第一次打包減少了500多MB了,那么還能更小嗎?請往下看,
runtime-deps:5.0-alpine
最新的.net core程式支持自宿主及單檔案發布,如果采用以上發布形式,那么我們可以選擇使用runtime-deps:5.0-alpine做為最終底包來打包我們的鏡像,
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base
WORKDIR /app
EXPOSE 5000
FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /src
COPY ["CoreDockerImageSizeTest/CoreDockerImageSizeTest.csproj", "CoreDockerImageSizeTest/"]
RUN dotnet restore "CoreDockerImageSizeTest/CoreDockerImageSizeTest.csproj"
COPY . .
WORKDIR "/src/CoreDockerImageSizeTest"
RUN dotnet build "CoreDockerImageSizeTest.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "CoreDockerImageSizeTest.csproj" -c Release -o /app/publish \
--runtime alpine-x64 \
--self-contained true \
/p:PublishTrimmed=true \
/p:PublishSingleFile=true
FROM mcr.microsoft.com/dotnet/runtime-deps:5.0-alpine AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["./CoreDockerImageSizeTest"]
修改Dockerfile,使用/runtime-deps:5.0-alpine做為final鏡像,
REPOSITORY TAG IMAGE ID CREATED SIZE
coredockerimagesizetest_0.5 latest dab1289626f9 6 seconds ago 54.6MB
使用docker build命令進行打包,使用docker images命令查看鏡像的大小,這個鏡像的大小為54.6MB,
總結
通過以上演示,我們的鏡像大小從一開始的600多MB縮小到了54MB,一般生產我主要選擇buster-slim這個鏡像來打包,如果選擇runtime-deps打包,打出來的包是最小的,雖然演示專案是可以運行的,但是本人沒有在生產使用過,還請謹慎使用,
代碼在這:CoreDockerImageSizeTest
關注我的公眾號一起玩轉技術

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/270438.html
標籤:.NET Core
上一篇:JWT原理實作代碼
下一篇:談談對IOC及DI的理解與思考
