在这容器化的世界里,我们已经很少直接通过文件发布来运行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

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

优化 ASP.NET Core Docker 镜像的大小相关推荐

  1. Asp.Net Core Docker镜像更新系统从wheezy改为stretch

    之前写过一个在Asp.Net Core里调用System.Drawing.Common绘图的DEMO,部署到Docker里运行,需要更新Asp.Net Core镜像的操作系统. https://www ...

  2. Asp.Net Core + Docker 搭建

    一.Docker安装 (1)机器准备 本次实验,我是在Win10上,使用Vmware Workstation虚拟机安装的Ubuntu 18.04.l LTS版本进行搭建. (2)安装Docker   ...

  3. ASP.NET Core Docker部署

    前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序. ...

  4. ASP.NET Core Docker Jenkins 零基础持续集成实战

    一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker 二.git管理软件的选择 没有采用gitlab,因为gitlab比较吃配置,至少得2核4G的配置.采用g ...

  5. ASP.NET Core + Docker + Jenkins + gogs + CentOS 从零开始搭建持续集成

    没有采用gitlab,因为gitlab比较吃配置.也比较重,用不到那么多功能.采用go语言开发的gogs来代替. 免费HTTPS证书 安装Gogs (一个gitserver,类似于gitlab) 安装 ...

  6. ASP.NET Core Docker Nginx分权,多网站部署

    https://www.cnblogs.com/esofar/p/10694319.html 转载于:https://www.cnblogs.com/baiqian/p/10820476.html

  7. Docker镜像优化

    Docker镜像优化 原文:Docker镜像优化 前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerf ...

  8. ASP.NET Core 部署到docker

    ASP.NET Core 部署到docker ASP.NET Core:ASP.NET Core程序使用Docker部署 前提:本地已有 ASP.NET Core web应用程序,并且已安装docke ...

  9. Centos下使用Docker部署asp.net core项目

    本文讲述 CentOS 系统 Docker 中部署 asp.net core开源项目 abp 的过程 步骤 1. 拉取 asp.net core 基础镜像 docker pull microsoft/ ...

最新文章

  1. 『流畅的Python』第14章:可迭代的对象、迭代器和生成器
  2. oracle10gr2 x86,Oracle10gR2 On RHEL5 x86安装技术文档(英文原版)
  3. 分隔符怎么打出来_男孩地铁上打奶奶,踹爷爷:熊孩子都是怎么培养出来的?...
  4. 个人的关于c++运算符重载的总结
  5. linux环境下ntp客户端,多种操作系统NTP客户端配置
  6. Android优秀开源项目大全
  7. Qt工作笔记-设置窗体底纹以及控件透明度
  8. YOLOv1深刻解读
  9. HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解
  10. oracle有哪两种内存结构,Oracle体系结构详解(物理构造,内存结构和逻辑结构)...
  11. 分布式定时器的实现原理
  12. Web 设计师的 50 个超便利工具[下]
  13. 兼容多种浏览器“复制到剪贴板”的解决方案
  14. matlab2016数模a,2016年全国数学建模竞赛A题国家一等奖.pdf
  15. 华为交换机重制_华为交换机如何初始化?华为交换机初始化配置-百度经验
  16. vue 日期格式化-将时间2020-11-10T12:01:50.942转换成2020-11-10 12:01
  17. 《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
  18. 记一次智能灯泡的破解
  19. Linux系统如何安装?
  20. php ncr转utf8

热门文章

  1. lstm需要优化的参数_使用PyTorch手写代码从头构建LSTM,更深入的理解其工作原理...
  2. 【技术累积】【点】【java】【27】@JSONField
  3. WdatePicker 设置日期第一个比第二个的日期小
  4. C#委托,事件理解入门 (译稿)
  5. mysql 表数据转储_在MySQL中仅将表结构转储到文件中
  6. Ubuntu Core 给物联网提供更多安全支持
  7. 面试专题(Mysql及Mongodb)
  8. Vue根据菜单json数据动态按需加载路由Vue-router
  9. 去创业公司不能有一夜暴富的侥幸,更不能指望掉馅饼
  10. Python的MySQLdb模块安装