- 主题:docker image 分层的问题
就是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.*
没太明白你这个啥分层。。
docker 有一种用法是这样:
FROM alpine:3.13.2 AS builder
一堆编译命令
FROM scratch
COPY --from=builder /etc/passwd /etc/passwd
这个办法产生的 docker image 比较小。我看你的 COPY 命令里面没有 --from 参数,要不要试一试这一招?
【 在 iwannabe 的大作中提到: 】
: 就是gitlab ci的时候,会build docker image,再push到registry上,我用的是公有云
: 的容器镜像服务,所以希望每次push都能做到尽可能小的增量
: project是java springboot的工程,每次都会生成一个jar包,这个jar包大概200m,如果
: ...................
--
FROM 59.60.25.*
汇报一下,这个问题主要是gitlab ci是docker:dind 对应的/var/lib/docker 目录都从
内存中生成导致每次都需要重新下载image
所以设置一个pvc,缓存/var/lib/cache就可以了
【 在 hgoldfish 的大作中提到: 】
: 没太明白你这个啥分层。。
: docker 有一种用法是这样:
: FROM alpine:3.13.2 AS builder
: ...................
--
FROM 119.139.198.*