概述Google开源GitHub14.4K Star1.5K Fork、纯Java实现、可直接构建Java应用的Docker和OCI镜像的类库以Maven和Gradle插件形式提供能力。可在没有Docker守护程序的情况下构建。传统Docker构建流程需先把项目打成Jar、编写Dockerfile、安装Docker、使用Docker构建功能进行构建镜像、运行容器。Jib的构建策略将Java应用程序分为多层如依赖项、资源和类利用Docker映像层缓存仅通过重建更改来保持构建速度实现更细化的增量构建更改代码时仅重建更改而不重建整个应用程序。Jib的层组织和小型基础映像可使整体映像尺寸变小从而提升性能和可携性。特点无需DockerfileJib直接从应用程序构建容器镜像而无需手动编写Dockerfile也不依赖于Docker守护进程分层构建将Java应用程序的构建分为多个层依赖项、资源、类文件等加快增量构建的速度避免每次构建都重新打包整个应用快速与轻量采用高效分层技术Jib生成的镜像体积较小构建速度也更快特别适合在CI/CD管道中使用集成简单可通过Maven或Gradle插件与项目集成使用简单的配置就可以实现自动化的容器镜像构建和推送优势高效的分层构建将项目的依赖项、资源、类文件等分层存储避免在每次构建时重新打包所有内容只更新有变动的部分加快构建速度无Docker依赖不需要在本地或CI环境中安装Docker通过HTTP将镜像直接推送到远程Docker仓库云原生友好与Kubernetes等云原生平台集成简单便于在云环境中进行应用部署Jib将Java项目打包成分层镜像基础镜像层使用Java运行时环境如OpenJDK作为基础镜像依赖项层存储项目的外部依赖库如通过Maven导入的依赖资源层存储项目的静态资源文件如src/main/resources中的内容类文件层存储项目的编译后的.class文件这些内容被分为独立的层Jib只会在实际发生变化的层上进行更新。项目依赖项没有变化时Jib不会重新打包这些依赖从而大大提高构建速度。特点Jib传统Dockerfile依赖Docker无需Docker守护进程构建速度快速分层构建优化支持增量构建每次构建都需要重新打包镜像编写难度无需编写Dockerfile使用Maven/Gradle插件即可需编写Dockerfile并手动管理镜像构建步骤集成难度与Maven、Gradle无缝集成适合CI/CD需安装Docker并配置构建环境镜像优化自动优化镜像层减少镜像体积手动控制镜像构建步骤容易导致较大的镜像开发者体验更加开发者友好特别适合Java开发需额外学习Dockerfile语法默认情况下Jib会把打好的镜像上传到Google的GCR仓库实际工作时需把打好的镜像上传到私有仓库。容器注册表镜像仓库支持Google Container Registry(GCR)、Amazon Elastic Container Registry、Docker Hub、JFrog Container Registry、Azure Container Registry。Jib提供Maven和Gradle插件两种形式可将它无缝集成进你的构建流程中。每次构建项目时Jib会自动感知代码变更并构建新的镜像省去手动执行docker build和docker push的麻烦非常适合集成进CI/CD流程。作为对比Spring Boot直到2.3.0.RELEASE才推出构建镜像的功能需要有Docker或Podman容器运行时Spotify提供的docker-maven-plugin项目早已于22年3月21日归档已不再维护Spotify提供的dockerfile-maven项目早已于22年4月1日归档已不再维护且仍需依赖Dockerfile。jib-maven-plugin为Java应用程序提供快速、可重复和无需守护进程、来构建Docker和OCI镜像的插件无需Docker守护进程也无需深入掌握Docker的最佳实践。最简配置plugingroupIdcom.google.cloud.tools/groupIdartifactIdjib-maven-plugin/artifactIdversion3.4.6/version/plugin打开IDEA的Maven侧边栏可看到如下插件及其生命周期双击即可运行实际上就是触发命令行。对于上述最简配置即只是引入GAV执行命令行时可传入参数mvn clean compile jib:build\-Djib.to.imagemyregistry/myimage:latest\-Djib.to.auth.username$USERNAME\-Djib.to.auth.password$PASSWORD以我现在工作项目的真实CI/CD脚本来说会执行如下命令mvn$MAVEN_CLI_OPTS--gs$MAVEN_SETTINGS_PATHcompile jib:build\-Dimage${KANIKO_IMAGE_TAG}\-Djib.to.auth.usernameAWS\-Djib.to.auth.password$(aws ecr get-login-password--region$ECR_REGION)\-Djib.to.tags${CI_COMMIT_SHA},latest,${VERSION_DATE}\-Djib.from.auth.usernameAWS\-Djib.from.auth.password$(aws ecr get-login-password--region$ECR_REGION)\-Djib.from.image${MAVEN_JIB_BASE_IMAGE:-${REGISTRY}/${BASE_IMAGE}}\-Djib.container.creationTimeUSE_CURRENT_TIMESTAMP\-Djib.container.jvmFlags-javaagent:./dd-java-agent.jar,-server\-Djib.container.labelsversion${VERSION_DATE}\-Djib.extraDirectories.paths$CI_PROJECT_DIR/jib-agent在本地部署前需配置好访问目标镜像仓库的认证信息。以DockerHub为例可将认证信息配置在~/.m2/settings.xml中serversserveridregistry.hub.docker.com/idusernameadmin/usernamepasswordroot/password/server/servers推荐使用认证助手工具如docker-credential-helpers将凭证加密存储在本地而不是明文写在settings.xml中。修改pom.xml配置plugingroupIdcom.google.cloud.tools/groupIdartifactIdjib-maven-plugin/artifactIdversion3.4.6/versionconfigurationtoimage${image.path}/image/to/configuration/plugin配置完成后只需执行mvn compile com.google.cloud.tools:jib-maven-plugin:3.4.6:build或简化版mvn compile jib:build就可完成镜像构建和推送。首次执行需下载依赖后续构建比初始构建快得多。默认情况下Jib会自动推断基础镜像FROM和入口命令ENTRYPOINT等配置使用Eclipse Temurin基础镜像自动检测项目的入口点并将其配置为镜像的默认启动命令可根据需要进行自定义。标签tags、挂载卷volumesconfigurationfrom!-- 基础镜像 --imageopenjdk:alpine/image/fromtoimage${image.path}/imagetags!--镜像版本--tagv1/tag/tagsauth!--用户名密码--username/usernamepassword/password/auth/tocontainerports!-- Spring Boot默认监听端口 --port8082/port/portsentrypointjava!-- 自定义容器镜像的入口点即启动命令 --args-jar/argsargs/app/my-app.jar/args/java/entrypointenvironment!-- 环境变量 --ENV_VARVALUE/ENV_VARJAVA_OPTS-Xmx512m/JAVA_OPTS/environment/container/configurationexecutionsexecutionphasepackage/phasegoalsgoalbuild/goal/goals/execution/executions也支持对Java运行时进行配置jvmFlags传递给JVM的启动参数mainClass指定主类Jib默认会自动推断args传递给main方法的参数也可直接构建镜像到Docker守护进程需PATH中有docker命令行工具mvn compile jib:dockerBuild。使用 minikube 的远程 Docker 守护进程eval$(minikube docker-env)mvn compile jib:dockerBuild将镜像构建并保存为tarball文件mvn compile jib:buildTar可将jib:build绑定到Maven生命周期如package通过在jib-maven-plugin定义中添加以下执行plugingroupIdcom.google.cloud.tools/groupIdartifactIdjib-maven-plugin/artifactIdexecutionsexecutionphasepackage/phasegoalsgoalbuild/goal/goals/execution/executions/pluginGradle对于使用Gradle的项目添加如下插件依赖plugins{idcom.google.cloud.tools.jibversion3.3.0}Jib Core即Jib Java库可直接以API方式实现上述插件实现的功能适合定制需要场景。
