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

发布时间 2023-06-21 06:52:12作者: 济南小老虎

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%

总体优化效果