使用Jib的Java应用程序的容器化工作流程

116 阅读2分钟

构建Docker镜像是基于微服务架构的一个非常常见的工作流程。想象一下,你想为一个基于Spring Boot框架的Web应用创建并推送一个镜像。清单1显示了一个普通Spring Boot应用程序的基本设置。

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.0.5.RELEASE'
    id 'io.spring.dependency-management' version '1.0.6.RELEASE'
}

repositories {
    jcenter()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtime 'org.postgresql:postgresql:42.2.5'
}

清单1.用Gradle构建一个Spring Boot应用程序

将Jib添加到构建过程中是很简单的。只需应用具有特定版本的Jib Gradle插件。可选的是,你也可以提供自定义配置来控制插件的运行时行为。清单2显示了如何通过应用Jib插件和为图像提供一个标签来增强现有的构建脚本。

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

jib.to.image = 'bmuschko/my-java-app:1.0'

清单2.声明和配置Jib Gradle插件

有了这4行代码,已经可以通过运行jib 任务来执行容器化工作流程。下面的输出应该给你一个关于其内部运作的提示。

$ ./gradlew jib --console=verbose
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
warning: Base image 'gcr.io/distroless/java' does not use a specific image digest - build may not be reproducible

Containerizing application to bmuschko/java-app-jib:1.0...

Retrieving registry credentials for registry.hub.docker.com...
Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...
> Task :jib

Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, com.bmuschko.todo.webservice.Application]

Built and pushed image as bmuschko/java-app-jib:1.0

你可以在控制台输出中看到,该工具为应用程序的依赖性、资源文件和类文件创建了单独的层。Jib还通过扫描classpath来确定主类名称。

根据提供的镜像名称,Jib确定该镜像应该被推送到Docker Hub,在docker-credential-helpers的帮助下检索我存储的凭证,最后执行操作。你可以通过运行docker images 来验证Jib实际上并没有通过Docker引擎创建一个镜像。没有发现带有标签bmuschko/java-app-jib:1.0 的镜像。

构建和推送独立于Docker引擎的镜像可以非常强大。Jib从开发者那里完全抽象出了实现细节。没有必要完全理解这些细节。你可以简单地相信,Jib会产生所需的结果。避免安装Docker的需要在CI/CD环境中非常有利。CI代理可以执行容器化任务,而不需要设置和维护另一个工具的负担。