就是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.*