不知道有人碰到过没有
就是 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 值
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.