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.概述 我们制作好镜像后,有时需要将镜像复制到另一台服务器使用. 能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网 ...
随机推荐
- 下载安装Android Studio
1,安装java的jdk 2,下载安装Dart 3,下载安装 Android Studio 建议这个安装在C盘,以防后期出现各种问题 在plugins中 (1)下载dart插件 (2)下载flutt ...
- 容器、Docker、虚拟机,别再傻傻分不清
摘要:容器技术起源于Linux,是一种内核虚拟化技术,提供轻量级的虚拟化,以便隔离进程和资源.尽管容器技术已经出现很久,却是随着Docker的出现而变得广为人知. 容器技术起源于Linux,是一种内核 ...
- 这项评测,华为云GaussDB(for MySQL)顺利通过
摘要:近日,中国信息通信研究院(简称"中国信通院")公布了第十五批"可信数据库"评测结果.华为云GaussDB(for MySQL)凭借过硬的技术实力顺利通过& ...
- 华为云IoT设备接入服务全体验
摘要:华为云IoT设备接入服务,海量设备,一键接入,你值得拥有! 本文分享自华为云社区<[云驻共创]Huawei Mate 40产线直击之 华为云IoT设备接入服务全体验>,原文作者:启明 ...
- Weex原理及架构剖析
早期H5和Hybrid方案的本质是,利用客户端App的内置浏览器(也就是webview)功能,通过开发前端的H5页面满足跨平台需求.比如PhoneGap cordova ionic -- 该方案提升开 ...
- appuploader iOS 应用自动发布
appuploader是一款专门为 iOS 和 Android 开发人员设计的自动化工具,可以帮助开发人员轻松解决一些繁琐的任务,例如生成屏幕截图.处理配置文件和发布应用程序等.这个工具可以让开发人员 ...
- Lambda 表达式各种用法,你都会了吗
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 前言 Lambda表达式是 Java 8 中引入的最有影响力的功能之一.它们通过允许简洁而优雅地创建匿名函数来实现 Jav ...
- 【django-vue】celery延迟任务、定时任务 django中使用celery 秒杀功能 双写一致性 首页轮播图定时更新 课程前端页面
目录 上节回顾 字符编码 django-redis 今日内容 1 celery 执行异步任务,延迟任务,定时任务 延时任务 定时任务 2 django中使用celery 2.1 秒杀功能 2.1.1 ...
- CNS0创建交货单没有WBS元素
1.问题 CNS0创建交货单带不出WBS,但是交货单过账之后,又可以读取到WBS. 2.原因 2.1.项目挂料 创建项目挂料时,当物料为通用料,则在网络中挂料时,采购类型为网络预留 当物料为专用料,则 ...
- 加密原理详解:对称式加密VS非对称式加密
一.前言 在了解加密原理前,我们来看看这样一个故事. 小红和小明是情侣,一天,小红给小明发短信说:"亲爱的,我银行卡上没有钱了,你给我转1万块吧."有过上当受骗经历的人都知道这有可 ...