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 与镜像层的更多相关文章

  1. Docker3-Dockerfile创建镜像的方法(推荐docker file这种方法)

    一.镜像制作的方法 1.本地导入导出镜像 请参考:Docker 架构原理及简单使用 导出:docker save nginx >/tmp/nginx.tar.gz 导入:docker load ...

  2. Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  3. docker(三)docker镜像和镜像发布方法

    一.从公网docker hub 拉取image ~ # 搜索docker search centos~ » docker pull centos admin@steven- Using default ...

  4. [docker]一些经常或不经常用到的镜像启动方法-一些常用的docker启动方式

    一些经常或不经常用到的镜像启动方法 设置容器的TZ另一种办法 参考: https://github.com/spujadas/elk-docker/blob/master/start.sh ## ov ...

  5. Docker 学习笔记(二):Dockerfile 定制镜像

    镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...

  6. docker 通过commit方法创建镜像(Tomcat+Java+Scala)

    前一阵试了试写Dockerfile创建docker image,但有时全靠Dockerfile写实在有些难度,退而求其次试一试使用commit来创建镜像: 想了想干脆创建一个Java+Scala+To ...

  7. Docker技术入门与实战 第二版-学习笔记-4-Dockerfile外其他生成镜像的方法

    其它生成镜像的方法 即除了标准地使用Dockerfile来生成镜像外,还有一些其他的方法 1)从 rootfs 压缩包导入 格式:docker import [选项] <文件>|<U ...

  8. 【转载】使用Docker Hub官方gcc:latest镜像编译C/C++程序以及缩小镜像的方法

    摘要:使用Docker Hub官方gcc:latest镜像(1.2GB)编译C/C++程序,以及缩小镜像的方法. 方法1: 在gcc容器里编译C/C++程序 将C/C++代码运行在gcc容器内的最简单 ...

  9. 【Docker】镜像分层存储与镜像精简

    Linux操作系统 Linux操作系统由内核空间和用户空间组成. 内核空间是kernel,用户空间是rootfs, 不同Linux发行版的区别主要是rootfs.比如 Ubuntu 14.04 使用 ...

  10. Docker镜像保存为文件及从文件导入镜像的方法

    参考 1.概述 我们制作好镜像后,有时需要将镜像复制到另一台服务器使用. 能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网 ...

随机推荐

  1. 大地经纬度坐标系与Web墨卡托坐标系的转换

    目录 1. 概述 2. 实现 3. 参考 1. 概述 我在<大地经纬度坐标与地心地固坐标的的转换>这篇文章中已经论述了大地坐标系/地理坐标系的概念,简单来说就是由经度.纬度以及高程(BLH ...

  2. 【Pandas】groupby连用的count()和size()的区别

    groupby连用的count()和size()的区别 count() 计算的是 value(数值): size() 计算的是 size(个数) 我们有以下表: size() age = df.gro ...

  3. Copy攻城狮辛酸史:含泪“一分钟”跑通MindSpore的LeNet模型

    摘要:一个Cope 攻城狮用切身实例告诉你: Cope代码体验一时爽,BUG修改花半天. 前言:此文为r0.7-beta的操作实践,为什么我的眼里常含泪水,因为我对踩坑这件事爱得深沉.谨以此文献给和我 ...

  4. 一文带你熟悉Pytorch->Caffe->om模型转换流程

    摘要:本文旨在分享Pytorch->Caffe->om模型转换流程. 标准网络 Baseline:PytorchToCaffe 主要功能代码在: PytorchToCaffe +-- Ca ...

  5. 【火热招募】一文看懂华为云IoT Edge边缘计算开发者大赛技术亮点

    摘要:第二届边缘计算开发者大赛已启动,赛程时间将从9月持续到12月,华为云IoT Edge · 边云协同赛道奖金池高达40万元. 近日,第二届边缘计算开发者大赛已启动(查看启动仪式),全球揭榜挂帅火热 ...

  6. 华为云企业级Redis:助力VMALL打造先进特征平台

    摘要:当电商平台对AI算法模型的需求越来越多,特征数据平台的统一建设是不少开发团队头疼的事情.因为只有通过统一的特征数据存储,才能改变原有的"数据孤岛",解决生产重复造轮子的窘境. ...

  7. HIVE报错 need to specify partition columns because the destination table is partitioned

    解决 分区需要指定分区 insert into table XXX partition(分区='')

  8. 处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法

    ​ 开发人员账号到期时,应采取以下步骤处理APP被下架问题: 登录开发者账号. 点击右上角的"账户",选择"续费". 输入信用卡信息,确保使用支持Visa的银行 ...

  9. 最高提升10倍性能!揭秘火山引擎ByteHouse查询优化器实现方案

     更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   作为企业级数据库的核心组件之一,查询优化器的地位不可忽视.对于众多依赖数据分析的现代企业来说,一个强大且完善 ...

  10. Java SpringBoot FTP 上传下载文件

    POM 添加依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all< ...