Docker镜像精简方法之二 COPY vs ADD 与镜像层

docker,镜像,精简,方法,之二,copy,vs,add · 浏览次数 : 20

小编点评

## Docker镜像精简方法之二 COPY vs ADD 与镜像层摘要 **COPY** * 将文件从一个层复制到另一个层。 * 速度较快。 * 需要创建多层目录结构。 **ADD** * 将文件从一个层复制到另一个层,并解压缩。 * 速度略慢,但效率较高。 * 不需要创建多层目录结构。 * 避免创建多于一个压缩包的体积。 **镜像层摘要** * 镜像层是一个包含与镜像相同的文件和目录的虚拟空间。 * 不同的镜像层可以指向同一文件。 * 可以在构建过程中创建和使用镜像层。 **修改注意事项** * **COPY** 可以使用 `-i`选项进行文件复制。 * **ADD** 可以使用 `-r`选项进行文件复制,并递归深度。 * **ln** 可以用于将文件复制到指定的路径。 **优化效果** * 使用 `ADD` 可以减少压缩包和解压缩包的体积。 * 使用 `COPY -i` 或 `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 与镜像层相似的内容:

Docker镜像精简方法之二 COPY vs ADD 与镜像层

# Docker镜像精简方法之二 COPY vs ADD 与镜像层 ## 摘要 ``` 昨天只是讲了一下大体的思路. 但是没有实操. 今天想着修改一下默认的打包镜像的命令,验证一下效果 ``` ## 原始命令 ``` FROM adoptopenjdk:8u222-b10-jdk-hotspot-b

01.Alpine编译glibc

概要 本文档采用glibc2.28版本作为示例,模拟内网环境无法访问github等开源社区 为精简docker容器镜像,采用Alpine镜像,需要手动编译glibc源代码 制作编译好的glibc二进制文件 获取glibc二进制文件构建工具 # 内网环境可下载该工具包手动上传到服务器 git pull

[转帖]Docker镜像最佳实践

https://www.zhihu.com/people/trumandu-95/posts 5条最佳建议 1.仅安装产线需要依赖与软件 镜像尽可能最小原则 仅复制jar/war 使用自定义JRE(Java Runtime Environment) 2.使用多阶段构建 FROM maven:3.6.

Docker镜像的基本操作总结

摘要 容器化是上个十年比较火的技术. 现在看起来在进行总计有点晚了. 不过linux是三十年前的,我依旧没有总结好 道理是一样的. 技术不在于新旧, 重要的是学习到原理. Docker的重要概念 Registry image container Docker的核心机制在于 从Registry里面拉取

Docker 镜像减少体积的思路和方法

# Docker 镜像减少体积的思路和方法 ## 背景 ``` 有一个项目感觉镜像有点大 这边同事喊着一起帮忙处理一下. 今天基本上就在客户现场进行处理了. 想着应该把自己想到的东西整理一下. ``` ## 整体思路 ``` 1. 清理dockerfile 同级目录内的文件, 仅保留必须文件 doc

[转帖]docker 镜像分层原理及容器写时复制

https://xie.infoq.cn/article/19c98e8b15ff9f610a2ee26bd 一、镜像分层与容器层 在进行docker pull 下载镜像的时候,通过下图可以看到镜像是分层下载并解压的。如 nginx:1.20.2 的镜像,其镜像是分为 6 层。 当我们运行一个新的容

Docker 镜像库国内加速的几种方法

概述 在国内,拉取 Docker 镜像速度慢/时不时断线/无账号导致限流等,比较痛苦😣. 这里提供加速/优化的几种方法。 梳理一下,会碰到以下情况: 国内下载速度慢/时不时断线:是因为网络被限制了。 没有公共镜像库账号导致限流:是因为 Docker Hub 等主流镜像库,近年来纷纷开始对未登录的匿

[转帖]查找 docker 镜像的所有 tag

https://www.jianshu.com/p/f974ec9e7937 建议阅读方式 可前往语雀阅读,体验更好:查找 docker 镜像的所有 tag 环境说明 centos7 阿里云主机一台: docker 相关信息如下: 测试镜像 hello-world 的 tags 情况见官网:dock

[转帖]查找 docker 镜像的所有 tag

查找 docker 镜像的所有 tag https://www.jianshu.com/p/f974ec9e7937 建议阅读方式 可前往语雀阅读,体验更好:查找 docker 镜像的所有 tag 环境说明 centos7 阿里云主机一台: docker 相关信息如下: 测试镜像 hello-wor

[转帖]Docker:Python环境Docker镜像瘦身

https://www.jianshu.com/p/c0ad13e0be85 关键字:Docker,Python 原始镜像 封装一个Python 3.7的环境并且安装Python依赖包实现一个机器学习算法预测任务,Dockerfile如下 FROM python:3.7 MAINTAINER xxx