Jib构建JavaDocker镜像-Gradle篇

281 阅读4分钟

一、前言

身为一只慵懒的菜鸡,简单高效实用便是追求,我们老大告诉我们构建Docker镜像可以很快奥(Jib),用上之后——真香!!!

二、Jib对开发的友好

1.简单 Jib 以 Java 实现,并作为 Maven 或 Gradle 构建的一部分运行。您无需维护 Dockerfile、运行 Docker 守护程序,甚至无需担心创建包含所有依赖项的 Fat JAR。由于 Jib 与您的 Java 构建紧密集成,因此它可以访问打包应用程序所需的所有信息。Java 构建中的任何变化都会在后续容器构建期间自动获取。 2.快速 Jib 利用镜像分层和注册表缓存来实现快速、增量构建。它会读取您的构建配置,将您的应用程序组织成不同的层(依赖项、资源、类),并且只重建和推送已更改的层。在快速迭代项目时,Jib 可以节省每次构建的宝贵时间,只需将更改的层推送到注册表,而不是整个应用程序。 3.可重现 Jib 支持从您的 Maven 和 Gradle 构建元数据以声明方式构建容器映像,因此只要您的输入保持不变,就可以配置为创建可重现的构建映像。

三、菜鸡上手

关于Jib 大家可以自行查阅,我这里就不过多介绍了(github详细的很)

jibgit.jpg

  • 快速开始 (我这里的是Gradle Java 项目)

将插件添加到build.gradle

plugins { id 'com.google.cloud.tools.jib' version '3.4.3' }

  • 直接上配置 (可以自行配置自己的)
jib {
// 从私人注册中心推送/拉取需要授权凭证。  这里我们在项目根目录下建gradle.properties 将这些auth认证的信息配到其中就可以
    val dockerUser: String by project
    val dockerPassword: String by project
    val tarDockerUser: String by project
    val tarDockerPassword: String by project
// 查找项目的主类信息
    val rootDirectory: Path = Paths.get(projectDir.toURI())
    val mainClassFinderResult: com.google.cloud.tools.jib.api.MainClassFinder.Result =
        com.google.cloud.tools.jib.api.MainClassFinder.find(
            com.google.cloud.tools.jib.filesystem.DirectoryWalker(
                rootDirectory
            ).walk()
        ) { }
    var mainClassName: String
    val mainClasses = mainClassFinderResult.foundMainClasses
    //当主类信息查不着时 可以自行配置
    mainClassName = if (mainClasses.isEmpty()) {
        "com.test.test" //主类
    } else {
        mainClassFinderResult.foundMainClasses.first()
    }
    print(mainClassName)
    //如果设置为packaged,则将 Gradle Java 插件构建的 JAR 工件放入最终映像中。如果设置为exploded(默认),则容器化单个.class文件和资源文件。
    containerizingMode = "packaged"
    //如果设置为 true,Jib 会忽略 HTTPS 证书错误,并可能在万不得已的情况下回退到 HTTP。false强烈建议将此参数设置为,因为 HTTP 通信未加密且网络上的其他人可以看到,而不安全的 HTTPS 并不比普通 HTTP 好。如果使用自签名证书访问注册表,则将证书添加到 Java 运行时的受信  
    setAllowInsecureRegistries(true)
    from {
    //基础镜像的镜像引用。可以使用特殊类型前缀来指定源类型   这里指定你自己的(自己玩可以装个docker 指定)
        image = "registry://**********/spring:latest"
        auth {
            username = dockerUser
            password = dockerPassword
        }
    }
    to {
    //目标图像的图像参考。这也可以通过--image命令行选项指定。如果标签不存在,则此处:latest隐含。  自行配置 还可以推送附加tags
        image = "test/test/service:1"  
        auth {
            username = tarDockerUser
            password = tarDockerPassword
        }
    }
    container {
    //	用于在容器上设置环境变量的键值对(类似于Docker 的ENV指令)  下面这些可以根据特定情况去配置
        environment =
            mutableMapOf("APP_NAME" to "你的serviceName", "PROFILE" to "dev", "APM" to "1", "MAIN_CLASS" to mainClassName)
            //启动容器的命令(类似于 Docker 的ENTRYPOINT指令)。如果设置,则jvmFlags、mainClass、extraClasspath和expandClasspathDependencies将被忽略。您还可以设置jib.container.entrypoint = 'INHERIT'以指示entrypoint和args应从基础映像继承。* 也可以使用提供程序延迟初始化该值。
        entrypoint = listOf("supervisord", "-c", "你的配置路径")
    }

}
  • 到这就配完了 为了方便 贴几张官方的解释说明

gradleFromTo.jpg

jibContainer.jpg

gibGW.jpg 愿意了解的可自行查询(看完之后发现玩法很多哦 😁)

  • 构建 推送

执行gradle命令 DsendCredentialsOverHttp 默认是false 会校验http发送 因为我这里是本地执行 自己玩的 不涉及安全这些 直接改成true

./gradlew jib -DsendCredentialsOverHttp=true

jibBuild1.jpg

jibBuild3.jpg

总结

Jib 可用作Maven和Gradle的插件,并且只需要极少的配置。只需将插件添加到您的构建定义并配置目标镜像即可 简单实用高效 感兴趣的可以去github上看看 对java开发那是真香