- 主题:docker image 分层的问题 (转载)
【 以下文字转载自 LinuxDev 讨论区 】
寄信人: iwannabe (I wanna be)
标 题: docker image 分层的问题
发信站: 水木社区 (Fri Jul 14 10:35:51 2023)
来 源: 119.139.199.115
不知道有人碰到过没有
就是gitlab ci的时候,会build docker image,再push到registry上,我用的是公有云
的容器镜像服务,所以希望每次push都能做到尽可能小的增量
project是java springboot的工程,每次都会生成一个jar包,这个jar包大概200m,如果
用类似
COPY xxxx.jar /app
这样的Dockerfile,每次jar这一层就要上传200m+
所以采用了jar包分层的技术,用
$ java -Djarmode=layertools -jar target/xxx.jar extract
得到四个目录,
Step 7/11 : COPY dependencies/ /app
---> 9831e5b6f9ae
Step 8/11 : COPY spring-boot-loader/ /app
---> 82f47422bade
Step 9/11 : COPY snapshot-dependencies/ /app
---> 24658da80ea8
Step 10/11 : COPY application/ /app
---> 6d47ede4decb
这样每次ci的时候,前三个目录基本没有变化,这样生成docker image的layer是不变的
,每次push只会push step 10之后的内容
这种方法在本地没有问题 mvn clean package... docker build -t ..., docker push
...显示只需要push最后一个layer
e44c9b0a313a: Pushed
5732f7831cbe: Layer already exists
48d1ef8e0017: Layer already exists
025a15bbce04: Layer already exists
8460ea9541f4: Layer already exists
de24004afe49: Layer already exists
a52fcbff5465: Layer already exists
767f936afb51: Layer already exists
然后在gitlab ci里,显示每次还是要push多个layer
看了一下日志,每次gitlab ci里build的时候,
Status: Downloaded newer image for ccr.ccs.tencentyun.com/.../xx:latest
---> 08909e73839f
Step 2/11 : ENV AppName xxx-system
---> Running in b66bf82ba02d
Step1的hash值是一样的,但是Step 2的hash值就发生变化了,理论上相同的操作应该产
生相同的hash值
--
修改:iwannabe FROM 119.139.199.*
FROM 119.139.199.*
猜测
本地和gitlab是不是不同配置?
是不是有时间戳之类的参与了?
【 在 iwannabe 的大作中提到: 】
: 寄信人: iwannabe (I wanna be)
: 标 题: docker image 分层的问题
: 发信站: 水木社区 (Fri Jul 14 10:35:51 2023)
: ...................
--
FROM 111.206.87.*
不是异常不异常的问题,是效率
如果不能复用之前的层就没有意义
【 在 hothail 的大作中提到: 】
: 在墙内的时候经常去看看
: 在墙外之后就懒的过去了
: 我也试做了一下,jenkins打包,没发现异常
: ...................
--
FROM 119.139.199.*
build了多个layer,
第一次是改了应用部分代码,最后只push了一个layer
第二次是改了pom依赖和应用代码,最后push了4个layer(dependencies以后的
我看到就是这样。
我想这是你想要的效果吧
FROM openjdk:8u212-jdk-stretch as builder
USER root
WORKDIR build
ARG JAR_FILE
ADD $JAR_FILE main.jar
RUN java -Djarmode=layertools -jar main.jar extract
FROM openjdk:8u212-jre
USER root
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /srv/logs
VOLUME /srv
EXPOSE 8080
ENV JAR_ARGS=" -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
WORKDIR /srv/server
COPY --from=builder build/dependencies/ ./
COPY --from=builder build/spring-boot-loader/ ./
COPY --from=builder build/snapshot-dependencies/ ./
COPY --from=builder build/application/ ./
ENTRYPOINT [ "java", "org.springframework.boot.loader.JarLaucnher" ]
【 在 iwannabe 的大作中提到: 】
: 不是异常不异常的问题,是效率
: 如果不能复用之前的层就没有意义
:
--
FROM 111.206.87.*