优化 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 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

关注我的公众号一起玩转技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法

没人会看的开场白:本来觉得自己从数据建模转人工智能方向应该问题不大(自我感觉自己算法学的不错)。结果一个K-邻近实现手写数字识别的代码就让我改了三四天。虽然网上这方面的代码是很多,但是我运行了好几个,结果都不…

xp怎样安装android-studio,Xposed 框架的安装

借鉴:安装流程:安装 雷电模拟器3.93下载安装xposed框架。xposed 框架在Dalvik 虚拟机和ART虚拟机上的安装不一样(至于ART虚拟机和Dalvik虚拟机的区别,可以参阅 文章)如果Android 版本不小于 5.0,就是ART版本的虚拟机,需…

cta策略 有哪些_CTA 主流的交易策略都有哪些?

CTA策略(Commodity Trading Advisor Strategy)称为商品交易顾问策略,也称作管理期货。主要通过在基本和技术分析中导入数量模型,并借助计算机系统根据数量模型产生的买卖信号进行投资交易。CTA基金策略完全通过不同期货合约及调期合约多/空头寸进行投资&…

饭碗和大师

最近受到一些同事的质疑,说你老刘只关心市场销售,对做技术的同事漠不关心,因为你的博客里头就没有怎么提过! 当然首先得向这写技术大师和小师们道歉!其实老刘并非不关心做技术的同事,只是因为老刘自愧对…

在 .NET Core 5 中集成 Create React app

翻译自 Camilo Reyes 2021年2月22日的文章 《Integrate Create React app with .NET Core 5》 [1]本文演示了如何将 Create React app 与 .NET Core 集成,以生成一个移除了几个依赖项的脚手架。Create React app 是社区中创建一个全新 React 项目的首选方式。该工具…

程序员找不到对象是因为还没遇到一个有远见的丈母娘

当别人在放肆秀恩爱的时候,程序员单身狗们在角落里瑟瑟发抖。别人去网站相亲找到对象,程序员去相亲找到BUG。其实,你找不到对象是因为你还没遇到一个有远见的丈母娘。都说程序员很难找到对象,就知道整天对着键盘一直敲敲敲&#x…

axios请求拦截器错误_Axios使用拦截器全局处理请求重试

Axios拦截器Axios提供了拦截器的接口,让我们能够全局处理请求和响应。Axios拦截器会在Promise的then和catch调用前拦截到。请求拦截示例axios.interceptors.request.use(function (config) {// 在发起请求请做一些业务处理return config;}, function (error) {// 对…

第十一章项目沟通管理重点--转载

《信息系统项目管理师教程》第十一章项目沟通管理重点 11.1项目沟通管理的重要性 1、编码、通信、传播媒介、噪声、解码。确认是接收到信号,但并不需要理解,而反馈信息指读懂信息,解码并回复。 2、沟通障碍:认识障碍、…

WPF 如何将IconFont图标转成Geometry

之前每次使用IconFont图标,都要去下载一个png图片,每次颜色什么的改了,都要重新下载,太苦逼了。现在好了,终于找到如何方便快速地使用IconFont图标了。是应该的演示如何从IconFont网站上找到Geometry先看看效果吧&…

给所有想从事软件研发的年轻工程师的忠告与建议

图片来源:Fargo Season 3一、我为什么写这篇文章:这几天,在某个IT论坛的软件培训与认证栏目中,看到了很多处于迷惑之中的人们,也看到了许多大家普遍感到困惑的问题,写此文章的目的,是想将我这些…

谁今天收到鸿蒙系统推送,鸿蒙系统正式推送,只有部分高端机才能收到

原标题:鸿蒙系统正式推送,只有部分高端机才能收到华为已经对鸿蒙2.0系统开始进行推送更新,从华为推出鸿蒙系统概念已经时隔几年了,如今华为把ppt系统映射进现实是真正为自己正名了,而且据华为陈述鸿蒙2.0已经能达到安卓…

layui导入模板数据_java+layui的Excel导入导出

//导入PostMapping(value "importData")ResultJson importData(RequestParam MultipartFile file) {ResultJson resultJson newResultJson();List importData null;try{importData ExcelUtil.importExcel(file.getInputStream(), ProjectJson.class);}catch(IOExce…

入门基础-VC网络编程入门

对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手。许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其所以而不知起所以然…

NET问答: 如何按属性进行 Distinct() ?

咨询区 Patrick Desjardins&#xff1a;我现在正在学习 LINQ&#xff0c;对一个简单类型的 List 进行 Distinct() 是非常简单的&#xff0c;如 List<int> 或 List<string>&#xff0c;但如果对复杂类型 List<T> 的某一个或者多个属性进行 Distinct() 的话&am…

html站点如何命名,html页面的CSS、DIV命名规则

68. XHTML文件中id的命名(1)页面结构容器: container页头&#xff1a;header内容&#xff1a;content/container页面主体&#xff1a;main页尾&#xff1a;footer导航&#xff1a;nav侧栏&#xff1a;sidebar栏目&#xff1a;column页面外围控制整体布局宽度&#xff1a;wra…

2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ

1选课须知1. 研究生选课系统什么时间开放&#xff1f; 答&#xff1a;2020年春季学期研究生选课系统开放时间为&#xff1a;2020年2月19日(周三)10:00至2020年3月9日(周一)10:00。2020年3月9日(周一)10:00后&#xff0c;研究生可以在选课系统中查询课表、已选课程、学分获得情况…

如何从零开始构建深度学习项目?这里有一份详细的教程

导读&#xff1a;在学习了有关深度学习的理论之后&#xff0c;很多人都会有兴趣尝试构建一个属于自己的项目。本文将会从第一步开始&#xff0c;告诉你如何解决项目开发中会遇到的各类问题。本文由六大部分组成&#xff0c;涵盖深度学习 ( DL ) 项目的整个过程。我们将使用一个…

性能分布式NewLife.XCode对无限数据的支持

上周发布了《改进版CodeTimer及XCode性能测试》&#xff0c;展示了NewLife.XCode在性能上的表现。实际上NewLife.XCode是一个很平凡的ORM&#xff0c;只是在分页和缓存方面多下点功夫&#xff0c;注意每一个细节&#xff0c;才能保证在数据量大、业务繁忙的环境中得以保持良好的…

C#实用小知识:string和判断null

stringstring是常用的类型&#xff0c;它具有不可变性&#xff1a;就是一旦赋值&#xff0c;就不可变&#xff0c;如果再赋值 &#xff0c;就重新开辟内存空间&#xff1b;保留性&#xff1a;如果一个字符串存在&#xff0c;另一个与其相同&#xff0c;他们会指向同一个地址&am…

s6730堆叠_不再只是堆叠硬件 ivvi S6全方位评测

【PConline 评测】ivvi是酷派公司的又一个全新的子品牌&#xff0c;与旗下的电商品牌“大神”相比&#xff0c;ivvi的定位更为高端&#xff0c;动用酷派公司的顶级资源打造&#xff0c;通过线上线下一体销售。在机身做工设计与硬件选用方面ivvi尽善尽美&#xff0c;集合了酷派手…