Featured image of post 使用Google JIB加速Java应用容器镜像构建

使用Google JIB加速Java应用容器镜像构建

JIB简介

Jib 是谷歌最新开源的 Java 应用的 Docker 镜像生成工具,可以通过 Gradle 或 Maven 直接生成镜像并上传到仓库而而不需要 Dockerfile 文件或者其他插件;Jib 支持将资源文件和类分层打包,可以大幅度提升生成镜像的速度。

为什么要用JIB?

  1. Docker架构CS设计存在缺陷,打包镜像时候会存在额外开销,会把Dockerfile同级目录下不需要的文件Copy给Docker Deamon,我们生产实际存在过node应用打包,缓存很多残留文件在Dockerfile同级的目录下,导致整个copy过程很慢。
  2. 传统SpringBoot打包没有办法最大利用镜像分层缓存技术,即使只改动一行代码,但是镜像层缓存的还是整个应用的BootJar,这个在镜像下载和推送的时候也是一个开销。

配置

build.gradle中添加配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
plugins {
    id 'java'
    id 'com.google.cloud.tools.jib' version '3.1.4' // 引入jib gradle插件
}

def date = new Date()

jib {
    from {
        image = 'openjdk:8-jdk-alpine' // 指定base镜像
    }
    to {
        image = 'registry.cn-shanghai.aliyuncs.com/xxxx/projectName:' + date.getTime() // 指定镜像私有registry地址
        auth { // registry用户名密码
            username = 'xxx'
            password = 'xxx'
        }
    }
    container {
        jvmFlags = ['-Duser.timezone=GMT+08'] // 指定jvm参数
        mainClass = 'xxxx,xxxx.XxxxApplication' // 启动类
        args = ['test'] // main 方法的传入参数
        ports = ['8080'] // 容器暴露的端口,和 Dockerfile 的EXPOSE作用相同
    }
}

构建镜像

在项目根目录下执行:

./gradlew clean jib./gradlew clean jibDockerBuild(通过docker deamon构建)

构建成功可以看到

1
2
3
4
Built and pushed image as registry.cn-shanghai.aliyuncs.com/XXX/XXX:1631811887971
Executing tasks:
[============================  ] 91.7% complete
> launching layer pushers

并且可以看到,在使用openjdk:8-jdk-alpine作为基础镜像的情况下,SpringBoot应用程序打出来的镜像只有100M出头,相比之前动则200-300M的镜像比缩小了近50%。

但这个created on 51 years ago 是肾么情况。。

通过 https://github.com/GoogleContainerTools/jib/issues/3030, 我们可以添加配置在build.gradle中:

1
2
3
4
5
6
7
jib {
    ....
    container {
        ....
        creationTime = 'USE_CURRENT_TIMESTAMP'
    }
}

但这样做会牺牲可重复性(but keep in mind that doing so will sacrifice reproducibility),详情请参考:https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#why-is-my-image-created-48-years-ago

Built with Hugo
主题 StackJimmy 设计