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.概述 我们制作好镜像后,有时需要将镜像复制到另一台服务器使用. 能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网 ...
随机推荐
- 微信小程序本地测试报错 IllegalArgumentException
在微信小程序本地测试时出现 IllegalArgumentException 错误,解决方法将https换成http Note: further occurrences of HTTP request ...
- Java 在PDF中添加文本水印、图片水印(基于Spire.Cloud.SDK for Java)
Spire.Cloud.SDK for Java提供了接口pdfWartermarkApi可用于添加文本水印addTextWartermark()和图片水印addImageWartermark()到P ...
- 【华为云技术分享】40%性能提升,华为云推出PostgreSQL 12 商用版
摘要:日前,华为云数据库正式推出了RDS for PostgreSQL 12版本,并开始商用.本文将从华为云RDS for PostgreSQL 12的4大特性和架构图等多方面来解读华为云Postgr ...
- Chrome扩展程序导出备份与本地导入浏览器
现在即使在国内下载个chrome,转个插件也千难万难.现在科学下网也越来越难,由于众所周知的原因,连qiang这个话题都是敏感词.哀默于心死,还是回避这个话题 只要把之前装的chrome打包,然后再重 ...
- 2023 年如何将您的应用提交到 App Store
您夜以继日地工作来创建您的梦想应用程序.最后,是时候向全世界宣布您的应用程序了.但不知道如何将您的应用提交到 App Store? 为您的商店获取现成的移动应用程序 将应用程序提交到 App Stor ...
- 直播实时数仓基于DataLeap开放平台在发布管控场景的业务实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 业务背景 随着字节业务的高速增长,业务场景越来越丰富,业务基于数据做的决策也越来越多,对数据的时效性要求也越 ...
- gitblit 不使用远程头像的方法
gitblit 安装非常简单,使用也很方便,由于我初次使用,遇到一个小问题,头像加载不出来,很影响系统的速度,网上找了很久,终于找到了解决办法. 1.仓库分组:创建仓库设定名称时录入:groupNam ...
- 【HZERO】feign调用
feign调用 https://open.hand-china.com/community/detail/603204901962649600 # Hiam获取用户信息示例
- OS | 银行家算法C语言实现
算法简介 银行家算法(Banker's Algorithm)是一个避免死锁( Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷 ...
- S3C2440移植uboot之支持NORFLASH
上节S3C2440移植uboot之支持NAND启动修改了代码支持了NAND启动.这节我们分析uboo使其支持NORFLASH的操作. 目录 1.分析启动错误 2.修改代码 3.在匹配数组中添加我们 ...