Docker镜像精简方法之二 COPY vs ADD 与镜像层
Docker镜像精简方法之二 COPY vs ADD 与镜像层
摘要
昨天只是讲了一下大体的思路.
但是没有实操.
今天想着修改一下默认的打包镜像的命令,验证一下效果
原始命令
FROM adoptopenjdk:8u222-b10-jdk-hotspot-bionic
WORKDIR /opt
COPY node-v12.22.12-linux-x64.tar /opt
RUN cd /opt && tar -xvf node-v12.22.12-linux-x64.tar
RUN mv node-v12.22.12-linux-x64 nodejs
RUN ln -s /opt/nodejs/bin/node /usr/bin
RUN ln -s /opt/nodejs/bin/npm /usr/bin
COPY node_modules /opt/nodejs/node_modules
RUN chmod 777 -R /opt/nodejs/node_modules
#RUN ln -s -i /opt/nodejs/node_modules/@farris/jit-engine/bin/index.js /usr/bin/jit
RUN ln -s -i /opt/nodejs/node_modules/@angular/cli/bin/ng /usr/bin/ng
打包效果
docker build . -t nodejs:20230527old
镜像信息大小: 706MB
镜像打包存在的问题.
1. 其实第一个问题是没有分阶段构建. 如果nodejs 比较稳定,可以打包做成一个基础. 这一块昨天已经提了.
2. COPY和解压缩以及目录转移在三个层, 直接镜像会大一个压缩包+解压缩包的大小.
其实可以修改为ADD的方式进行打包, 会小很多.
修改后的dockerfile
FROM adoptopenjdk:8u222-b10-jdk-hotspot-bionic
ADD nodejs.tar.gz /opt/
RUN ln -s /opt/nodejs/bin/node /usr/bin
RUN ln -s /opt/nodejs/bin/npm /usr/bin
COPY node_modules /opt/nodejs/node_modules
RUN chmod 777 -R /opt/nodejs/node_modules
RUN ln -s -i /opt/nodejs/node_modules/@farris/jit-engine/bin/index.js /usr/bin/jit
RUN ln -s -i /opt/nodejs/node_modules/@angular/cli/bin/ng /usr/bin/ng
修改注意事项
1. 我把copy 修改成了 add 的方式. 直接解压缩避免多一层, 多一个压缩包的体积.
2. 我修改了nodejs的压缩文件的名字, 直接修改为解压缩后的文件夹名. 这样ADD,可以直接解压缩到指定路径.
避免移动文件,产生多于的垃圾文件. (解压缩改名,重新压缩为tar.gz)
3. 其实可以将 ln -s 设置为一套 shell 脚本. 一件RUN 就可以. 但是容易不直观, 所以不再修改了.
打包效果
docker build . -t nodejs:20230527
镜像信息大小: 552MB
优化效果
镜像大小从706MB 缩减到了 552MB
缩小了 150M, 也就是压缩包+解压缩文件夹的大小.
通过gzip 转储镜像的大小可以从 237M 减少到 193MB
缩小了接近 50M的大小.
然后发现:
23M ./nodejs.tar.gz
83M ./nodejs
76M ./node-v12.22.12-linux-x64.tar
优化dockerfile 之前和之后的 镜像大小的区别是: tar包+nodejs文件夹的大小.
压缩转储导出的镜像缩小的大小就是 2个 nodejs.tar.gz的文件的大小. (两个无用的的文件层.)
压缩的效果
时间效果
[root@10.110.80.19 /sdhj]time docker save nodejs:20230527 -o nodejs_wihtoutCompress.tar.gz
real 1m34.253s
user 0m0.224s
sys 0m1.073s
[root@10.110.80.19 /sdhj]time docker save nodejs:20230527 | gzip > nodejs_wihtCompress.tar.gz
real 1m29.634s
user 0m33.671s
sys 0m2.136s
体积效果
root root 559M nodejs_wihtoutCompress.tar.gz
root root 193M nodejs_wihtCompress.tar.gz
因为这个机器的IO比较差. 所以可以看到 压缩后的时间反而更短.
如果IO比较好.时间都会短.
压缩比为: 35%
总体优化效果

Docker镜像精简方法之二 COPY vs ADD 与镜像层的更多相关文章
- Docker3-Dockerfile创建镜像的方法(推荐docker file这种方法)
一.镜像制作的方法 1.本地导入导出镜像 请参考:Docker 架构原理及简单使用 导出:docker save nginx >/tmp/nginx.tar.gz 导入:docker load ...
- Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- docker(三)docker镜像和镜像发布方法
一.从公网docker hub 拉取image ~ # 搜索docker search centos~ » docker pull centos admin@steven- Using default ...
- [docker]一些经常或不经常用到的镜像启动方法-一些常用的docker启动方式
一些经常或不经常用到的镜像启动方法 设置容器的TZ另一种办法 参考: https://github.com/spujadas/elk-docker/blob/master/start.sh ## ov ...
- Docker 学习笔记(二):Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...
- docker 通过commit方法创建镜像(Tomcat+Java+Scala)
前一阵试了试写Dockerfile创建docker image,但有时全靠Dockerfile写实在有些难度,退而求其次试一试使用commit来创建镜像: 想了想干脆创建一个Java+Scala+To ...
- Docker技术入门与实战 第二版-学习笔记-4-Dockerfile外其他生成镜像的方法
其它生成镜像的方法 即除了标准地使用Dockerfile来生成镜像外,还有一些其他的方法 1)从 rootfs 压缩包导入 格式:docker import [选项] <文件>|<U ...
- 【转载】使用Docker Hub官方gcc:latest镜像编译C/C++程序以及缩小镜像的方法
摘要:使用Docker Hub官方gcc:latest镜像(1.2GB)编译C/C++程序,以及缩小镜像的方法. 方法1: 在gcc容器里编译C/C++程序 将C/C++代码运行在gcc容器内的最简单 ...
- 【Docker】镜像分层存储与镜像精简
Linux操作系统 Linux操作系统由内核空间和用户空间组成. 内核空间是kernel,用户空间是rootfs, 不同Linux发行版的区别主要是rootfs.比如 Ubuntu 14.04 使用 ...
- Docker镜像保存为文件及从文件导入镜像的方法
参考 1.概述 我们制作好镜像后,有时需要将镜像复制到另一台服务器使用. 能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网 ...
随机推荐
- GOF23--23种设计模式(二)
一.建造者模式 建造者模式也是属于建造型模式,它提供了一种创建对象的最佳方式 定义:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示 主要作用:在用户不知道对象的构建细节的情 ...
- curl使用小记(二)——远程下载一张图片
目录 1. 概述 2. 实例 3. 参考 1. 概述 在之前的文章<curl使用小记(一)>中论述了命令行工具curl的基本使用.除此之外,curl还提供了能够直接供程序调用的模块库接口l ...
- Python中的cls语法
在Python中,cls 是一个用于指代类本身的约定性名称,通常用作类方法(class method)中的第一个参数.cls 类似于 self,它是对类的引用,而不是对实例的引用.cls 通常在类 ...
- openGauss内核分析:执行计划生成
摘要:SQL语句解析完成后被解析成Query结构,在进行优化时是以Query为单位进行的,Query的优化分为基于规则的逻辑优化(查询重写)和基于代价的物理优化(计划生成),主入口函数为subquer ...
- 带你了解NB-IoT标准演进
摘要:本文将带大家详细了解NB-IoT标准演进与产业发展. 本文分享自华为云社区<一文带你了解NB-IoT标准演进与产业发展>,作者:万万万. 我们都知道,物联网的场景和手机.电脑在使用的 ...
- 教你3种Kafka的指定副本作为Leader的实现方式
摘要:因为在我们实际的运维过程中,需要指定某个副本为ISR,但是Kafka中的Leader选举策略并不支持这个功能,所以需要我们自己来实现它. 本文分享自华为云社区<Kafka的指定副本作为Le ...
- 再谈BOM和DOM(4):DOM0/DOM2事件处理分析
JavaScript能够让网站对用户的各种操作及时做出"反馈",响应用户交互行为,而这些就是:DOM,事件以及事件处理 DOM就是操作的元素,这个看<再谈BOM和DOM(1) ...
- vivo智能活动中台-悟空系统建设之路
作者:来自 vivo 互联网悟空系统研发团队 本文根据冯伟.姜野老师在"2023 vivo开发者大会"现场演讲内容整理而成.[vivo互联网技术]公众号回复[2023 VDC]获取 ...
- OKR之剑·实战篇04:OKR执行过程优化的那些关键事
作者:vivo 互联网平台产品研发团队 本文是<OKR 之剑>系列之实战第 4 篇--OKR执行过程不是一成不变的,团队和个人在执行中不断优化执行的具体行动,保障OKR的高效执行. 前言 ...
- 关于 Serverless 应用架构对企业价值的一些思考
作者:寒斜 前言 对于企业方而言,最关心的核心诉求就是如何能获取更多的营收,更高的利润,通俗点说就是如何赚更多的钱:企业赚钱的方式主要是通过出售企业服务,当用户购买更多的企业服务,企业赚的钱就越多:而 ...