springboot docker 分层打包镜像,精减变动体积

2022年6月3日10:49:28

Dockerfile

FROM openjdk:8-jdk-alpine as basic
VOLUME /tmp
COPY BOOT-INF/lib /app/lib
COPY META-INF /app/META-INF
COPY BOOT-INF/classes /app/classes

FROM openjdk:8-jdk-alpine
COPY --from=basic /app/lib /app/lib
COPY --from=basic /app/META-INF /app/META-INF
COPY --from=basic /app/classes /app/classes

ENTRYPOINT java -XX:MaxRAMFraction=2 -cp app/classes:app/lib/* com.example.demo.DemoApplication

构建脚本

repository="harbor.hknaruto.com/library/training"

mvn clean package -Dmaven.test.skip=true -T4
mkdir target/dependency
cp Dockerfile target/dependency
(
  cd target/dependency
  jar -xf ../*.jar
  docker build -t "$repository":"$(git branch | awk '{print $2}')"."$(git rev-parse --short HEAD)" .
  # 清理老的镜像,本地保留3个最近构建的镜像,从第4个开始,删除本地镜像
  docker images | grep "$repository" | tail -n +4 | awk '{print $3}' | xargs -i docker rmi {}
)

第一次构建效果

$ docker history harbor.hknaruto.com/library/training:master.30b943a
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
f5d2de97b288        12 seconds ago      /bin/sh -c #(nop)  ENTRYPOINT ["/bin/sh" "-c…   0B                  
a50c1ee7d59c        12 seconds ago      /bin/sh -c #(nop) COPY dir:590e06da69bc4b6fc…   10.8kB              
5b91b3624e0a        12 seconds ago      /bin/sh -c #(nop) COPY dir:34d1e4a296310a6ec…   2.17kB              
52dcee3f3e35        4 minutes ago       /bin/sh -c #(nop) COPY dir:94d828a4ed8596549…   20MB                
a3562aa0b991        2 years ago         /bin/sh -c set -x  && apk add --no-cache   o…   99.3MB              
<missing>           2 years ago         /bin/sh -c #(nop)  ENV JAVA_ALPINE_VERSION=8…   0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV JAVA_VERSION=8u212       0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV PATH=/usr/local/sbin:…   0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/lib/jv…   0B                  
<missing>           2 years ago         /bin/sh -c {   echo '#!/bin/sh';   echo 'set…   87B                 
<missing>           2 years ago         /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ADD file:a86aea1f3a7d68f6a…   5.53MB

第二次构建效果

$ docker history harbor.hknaruto.com/library/training:master.30b943a
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
abc62088b1b6        1 second ago        /bin/sh -c #(nop)  ENTRYPOINT ["/bin/sh" "-c…   0B                  
61cf540de3ff        1 second ago        /bin/sh -c #(nop) COPY dir:d4dc9a24cb84bd616…   10.8kB              
5b91b3624e0a        2 minutes ago       /bin/sh -c #(nop) COPY dir:34d1e4a296310a6ec…   2.17kB              
52dcee3f3e35        5 minutes ago       /bin/sh -c #(nop) COPY dir:94d828a4ed8596549…   20MB                
a3562aa0b991        2 years ago         /bin/sh -c set -x  && apk add --no-cache   o…   99.3MB              
<missing>           2 years ago         /bin/sh -c #(nop)  ENV JAVA_ALPINE_VERSION=8…   0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV JAVA_VERSION=8u212       0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV PATH=/usr/local/sbin:…   0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/lib/jv…   0B                  
<missing>           2 years ago         /bin/sh -c {   echo '#!/bin/sh';   echo 'set…   87B                 
<missing>           2 years ago         /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ADD file:a86aea1f3a7d68f6a…   5.53MB

其中最大的lib目录由于没有发生变动,并没有执行更新。

注意,如果不采用COPY --from 方式,即使lib目录没有更新,也会重新创建新的层!导致镜像变动部分仍然很大。

  • 作者:hkNaruto
  • 原文链接:https://hknaruto.blog.csdn.net/article/details/123357837
    更新时间:2022年6月3日10:49:28 ,共 2603 字。