最佳化 ASP.NET Core Docker 映象的大小
在這容器化的世界裡,我們已經很少直接透過檔案釋出來執行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
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可以檢視這篇: 。
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打包,打出來的包是最小的,雖然演示專案是可以執行的,但是本人沒有在生產使用過,還請謹慎使用。
程式碼在這:
作者: Agile.Zhou
原文出處:https://www.cnblogs.com/kklldog/p/ant-design-pro-with-netcore.html
宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1868/viewspace-2797808/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Docker & ASP.NET Core (2):定製Docker映象DockerASP.NET
- Docker & ASP.NET Core (3):釋出映象DockerASP.NET
- 10 個最佳化技巧,減少 Docker 映象大小【轉】Docker
- docker映象最佳化Docker
- Docker & ASP.NET Core (5):Docker ComposeDockerASP.NET
- asp.net core 6 釋出dockerASP.NETDocker
- Logging with ElasticSearch, Kibana, ASP.NET Core and DockerElasticsearchASP.NETDocker
- Docker & ASP.NET Core (4):容器間的連線DockerASP.NET
- 最佳化您的部署:Docker 映象最佳實踐Docker
- Linux Docker 部署 ASP.NET Core應用LinuxDockerASP.NET
- Docker的`COPY --chmod`可將映象檔案大小減少35%Docker
- Jenkins + Docker + ASP.NET Core自動化部署JenkinsDockerASP.NET
- Asp.Net Core WebAPI+PostgreSQL部署在Docker中ASP.NETWebAPISQLDocker
- Docker & ASP.NET Core (1):把程式碼連線到容器DockerASP.NET
- 兩種github action 打包.Net Core 專案docker映象推送到阿里雲映象倉庫GithubDocker阿里
- docker 映象Docker
- ASP.NET 6.0 Core 遷移 ASP.NET Core 7.0ASP.NET
- ASP.NET Core ----ASP.NET Core中使用Code FirstASP.NET
- asp.net core釋出到docker報Microsoft.ApplicationInsights.AspNetCore miss的錯誤ASP.NETDockerROSAPPNetCore
- docker 映象中的uidDockerUI
- docker映象的釋出Docker
- Docker的映象使用-WindowDocker
- Docker映象的基本操作Docker
- 【asp.net core 系列】14 .net core 中的IOCASP.NET
- Docker 映象源Docker
- docker 映象加速Docker
- Docker私有映象Docker
- yamlapi docker 映象YAMLAPIDocker
- 聊聊Docker映象Docker
- docker2-映象原理及建立新的映象Docker
- docker 構建自己的映象Docker
- docker映象中json的作用DockerJSON
- 1.03 docker的映象和容器Docker
- 修改docker映象源的方法Docker
- Docker(五)Docker映象講解Docker
- 在ASP.NET Core中用HttpClient(六)——ASP.NET Core中使用HttpClientFactoryASP.NETHTTPclient
- 聊聊ASP.NET Core中的配置ASP.NET
- ASP.NET Core 中的快取ASP.NET快取