(TOC)
1。为什么要优化<代码> Dockerfile 代码>
我们如果使用<代码> Dockerfile> 代码来构建码头工人镜像,如果一不小心就会导致镜像大小超过1 g,这是非常恐怖的。一般也都是好几百兆。较大的镜像往往会导致移植,迁移缓慢,部署上线也就慢。
<代码> Dockerfile> 代码就像代码一样需要持续去进行优化。使用下面的几个优化方案,可以大幅度的减小镜像的大小。
2。优化方案
2.1减少镜像层数
最重要的因素是减少镜像的层数,这样能大大减小镜像的大小;
当然在减少层数和增加层数但能减少编译时长上,可以适当衡量。
说明:
<李>码头工人镜像可以看出是分层的,分层方向与<代码> Dockerfile> 代码相反,自下而上,李> <李>码头工人镜像每一层是共享的,即同一台机器中,如果<代码> Dockerfile> 代码编译的时候,前面的内容相同,则相应的层是引用相同的,当然内容自<代码> Dockerfile> 代码中要自上而下相同,有出现不一样的层数的时候,后面的层内容都会不同,基于这个原理,在没有任何修改的情况下,后面的编译都是使用之前的镜像缓存;李> <李>一层新的命令形成新的一层,如果涉及磁盘更新,而且没有在同一层删除,无论文件是否最后删除,都会带到下一层。李>
引用>基于上面的说明,层数越小,每一层大小越小,镜像总体就越小。
以下为一个示例,其优化原理是相邻的命令间用<代码>,和代码>让其只形成一层。
<代码类=" language-dockerfile "> #基础镜像 从节点:10.16高山建设者 #拷贝静态资源文件 副本。/应用程序/#工作目录 WORKDIR/应用程序 纱线运行配置设置注册https://registry.npm.taobao.org \ ,,纱sass-binary-site http://npm.taobao.org/mirrors/node-sass \配置集 ,,全球增加http-server@0.9.0 \纱 ,,纱安装\ ,,纱构建 #暴露端口 80年公开 #启动参数 CMD [" http服务器”、“构建”、“p”,“80”) 代码>但是,有种情况是分层更优的,共目的是为了减少码头工人编译时间,比如:
<代码类=" language-dockerfile ">从高山:最新 # command1耗时久,且比较稳定 运行command1 # command2涉及更新内容频繁 代码运行command2 > >之前因为<代码> command1 代码>耗时久,比如安装依赖包,而<代码> command2> 代码更新频繁,比如代码修改。这种场景下,如果每次编译都需要安装很久的依赖包,这样体验非常差,因为安装依赖包这部分很少有变化,所以如果分开2层,前面安装依赖包就会使用缓存,这样编译就非常快了。
2.2基于更小的镜像
在保证功能前提下,尽量使用更小的镜像。比如使用基于<代码>高山> 代码制作的镜像,或者带<代码>高山代码>标记的镜像。
还有使用谷歌Distroless高山Linux是:一个基于组织libc和busybox的面向安全的轻量级Linux发行版。
换句话说,它是一个体积更小也更安全的Linux发行版。比如以下示例,选择带<代码>高山代码>
<代码类=" language-dockerfile ">从节点:lts-alpine 运行的apk, no - cache添加ca证书卷发git \ ,,rm射频/var/cache/apk/* \ ,,update-ca-certificates 代码>2.3在每一层清理产生的垃圾文件或临时文件
以下整理了常用的基础镜像的清理命令:
基础镜像 清理命令 <代码>高山代码> <代码> rm射频/var/cache/apk/* 代码> <代码> centos 代码>/<代码> oraclelinux> 代码 <代码> rm射频/var/cache/yum/* 代码> ubuntu <代码> 代码>/<代码> debian> 代码 <代码> apt autoclean - y,和apt autoremove - y,和rm射频/var/lib/apt/* 代码>仍然是这个示例,以下含有删除缓存命令<代码> rm射频/var/cache/apk/* 代码>。
<代码类=" language-dockerfile ">从节点:lts-alpine 运行的apk, no - cache添加ca证书卷发git \ ,,rm射频/var/cache/apk/* \ ,,update-ca-certificates 代码>2.4使用
如何写一个最优的Dockerfile