ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Docker多阶段构建实战(multi-stage builds)

2021-04-14 16:02:46  阅读:177  来源: 互联网

标签:Core multi builds 构建 dotnet 镜像 Docker Dockerfile NET


在编写Dockerfile构建docker镜像时,常遇到以下问题:

  1. RUN命令会让镜像新增layer,导致镜像变大,虽然通过&&连接多个命令能缓解此问题,但如果命令之间用到docker指令例如COPY、WORKDIR等,依然会导致多个layer;
  2. 有些工具在构建过程中会用到,但是最终的镜像是不需要的(例如用maven编译构建java工程),这要求Dockerfile的编写者花更多精力来清理这些工具,清理的过程又可能导致新的layer;

为了解决上述问题,从17.05版本开始Docker在构建镜像时增加了新特性:多阶段构建(multi-stage builds),将构建过程分为多个阶段,每个阶段都可以指定一个基础镜像,这样在一个Dockerfile就能将多个镜像的特性同时用到,例如:先用SDK镜像构建.NET Core工程,再把构建结果和Runtime 合成,就做成了一个可以直接运行.NET Core工程镜像了;

官方描述如下图所示,地址是:https://docs.docker.com/develop/develop-images/multistage-build/

image

官方的实例是golang的,今天我们以.NET Core构建ASP.NET Core工程为例,介绍如何使用multi-stage特性构建.NET Core微服务镜像;

Dockerfile文件参见: https://github.com/geffzhang/AKS-learning-series/blob/master/src/TechTalksWeb/Dockerfile
### 第一阶段,用sdk 镜像进行编译

FROM microsoft/dotnet:2.1.300-sdk AS build-env

WORKDIR /TechTalksWeb

COPY NuGet.config ./

COPY TechTalksWeb.csproj ./

RUN dotnet restore

COPY . ./

#编译构建

RUN dotnet publish --configuration Release --output releaseOutput --no-restore

#build runtime image

### 第二阶段,用第一阶段的.NET Core编译文件和aspnetcore-runtime 镜像合成一个小体积的镜像

FROM microsoft/dotnet:2.1.0-aspnetcore-runtime

WORKDIR /TechTalksWeb

#从名为build-env的stage复制构建结果到工作目录

COPY --from=build-env /TechTalksWeb/releaseOutput ./

ENTRYPOINT ["dotnet", "TechTalksWeb.dll"]

上面就是分成了两个阶段构建的Dockerfile脚本,请参考每行的注释来理解,有以下几点需要重点关注:

  1. 一共有两次FROM指令出现,而最终的镜像是基于最后一个FROM生成的;
  2. WORKDIR 被定义了两次,因为前面阶段定义的变量在后面的阶段是用不了的;
  3. COPY --from=build-env 这个命令,可以将指定阶段的文件复制到当前阶段来,这一步很关键,第一阶段用.NET Core SDK构建出来的dll 文件,通过该命令复制到后面的阶段来使用了;
  4. 最后一个FROM是microsoft/dotnet:2.1.0-aspnetcore-runtime,这是asp.net core 运行环境镜像,最终镜像的内容就是dotnet:2.1.0-aspnetcore-runtime和sdk的构建结果,而前面的sdk镜像和最终构建结果无关;
image


标签:Core,multi,builds,构建,dotnet,镜像,Docker,Dockerfile,NET
来源: https://blog.51cto.com/u_7605937/2706024

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有