作者丨Pavan Kumar
译者 | 崔莹峰
编写Dockerfile看起来很随意马虎,除非你终极编写了大小为0.5GB的Docker镜像。是的,没错。我最近在做一个ReactJS项目,在那里我正在构建一个前端运用程序。React JS项目没有什么新鲜的。我利用了与范例前端运用程序相同的package.json,相同的依赖集。现在,我决定将运用程序迁移到Kubernetes。以是我将Docker镜像推送到DockerHub并考试测验在Kubernetes支配Pod。

我利用的是一个本地集群,Pod花了5分零7秒启动。我很惊异。然后我将其支配到AKS集群(Azure Kubernetes集群)。令人惊异的是,它花了3分40秒。这可是件大事。我考试测验对Pod进行压测以触发Kubernetes HPA(Horizontal Pod Autoscaler)。新的Pod须要同样的3分钟才能涌现,终极运用程序被太多的要求淹没,不堪重负甚至崩溃不断重启。经由调查,我创造镜像的大小是瓶颈,当然,你不会想要如此巨大的Docker镜像(0.5GB)。那时我意识到我必须对Docker镜像大小做些什么。因此,我利用了Docker多阶段构建的观点。
Docker构建:FROM node:alpineWORKDIR /appCOPY package.json ./COPY package-lock.json ./COPY ./ ./RUN npm iCMD ["npm", "run", "start"]1.2.3.4.5.6.7.
这是我最初的一个Dockerfile,它是为一个范例的ReactJS运用程序供应的。如果你打开查看,你就可以看到第一行代码,我利用了node:alpine作为根本镜像,如下是镜像构建完成后的尺寸。
非多阶段构建
这是构建镜像的范例方法,编写这样的Docker文件彷佛很随意马虎。但是从Kubernetes的角度来看,利用这种方法存在一些缺陷如下
a)镜像的大小直接影响Pod启动韶光。
b)镜像越小,Pod启动越快。
Docker多阶段构建:Dockerfile中的多阶段构建特性使你能够创建具有更好缓存和占用更小安全空间的较小容器镜像。利用多阶段构建,你可以在Dockerfile中利用多个FROM语句。每个FROM指令可以利用不同的根本镜像,并且每个FROM指令都会开始构建一个新的阶段。你可以有选择地将一个阶段构建好的内容复制到另一个阶段,对付那些不须要涌如今在终极镜像里的内容就留在上一个阶段好了。
彷佛不一样?好吧,让我们理解一下这个文件。
# Choose the Image which has Node installed alreadyFROM node:alpine as buildWORKDIR /codeCOPY package.json package.jsonCOPY package-lock.json package-lock.jsonRUN npm ci --production# COPY all the files from Current Directory into the ContainerCOPY . .# Install the Project Dependencies like Express FrameworkRUN npm run buildFROM nginx:1.22-alpine as prodCOPY --from=build /code/build /usr/share/nginx/html# Tell that this image is going to Open a PortEXPOSE 80# Default Command to launch the ApplicationCMD ["nginx", "-g", "daemon off;"]1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.
第一行称为阶段。这些阶段没有命名,你通过它们的整数来引用它们,从0开始表示第一条FROM指令。或者,你也可以通过向FROM指令添加AS来命名阶段。
然后别的的步骤保持不变。改变游戏规则的一个步骤是COPY——来自(第18行)。利用多阶段天生时,可以在Docker文件中利用多个FROM语句。每个FROM指令都可以利用不同的根本镜像,并且每个指令都开始构建一个新的阶段。你可以有选择地将一个阶段构建好的内容复制到另一个阶段,对付那些不须要涌如今在终极镜像里的内容就留在上一个阶段好了。
现在让我们开始构建镜像。
多阶段构建镜像尺寸
哇,是的!
图像大小压缩了95%。图像大小现在是27.2MB。
我确当地集群花了25秒来拉取镜像并开始利用。我的AKS集群花了10秒钟来拉取镜像并开始利用。
这便是如何利用Docker中的多阶段构建来压缩Docker镜像的大小。
原文链接:
https://levelup.gitconnected.com/how-i-reduced-the-size-of-my-docker-image-by-95-520a05439300
译者简介崔莹峰,51CTO社区编辑,一名70后程序员,拥有10多年事情履历,长期从事 Java开拓,架构设计,容器化等干系事情。
来源: 51CTO技能栈