一、前言
身为一只慵懒的菜鸡,简单高效实用便是追求,我们老大告诉我们构建Docker镜像可以很快奥(Jib),用上之后——真香!!!
二、Jib对开发的友好
1.简单 Jib 以 Java 实现,并作为 Maven 或 Gradle 构建的一部分运行。您无需维护 Dockerfile、运行 Docker 守护程序,甚至无需担心创建包含所有依赖项的 Fat JAR。由于 Jib 与您的 Java 构建紧密集成,因此它可以访问打包应用程序所需的所有信息。Java 构建中的任何变化都会在后续容器构建期间自动获取。 2.快速 Jib 利用镜像分层和注册表缓存来实现快速、增量构建。它会读取您的构建配置,将您的应用程序组织成不同的层(依赖项、资源、类),并且只重建和推送已更改的层。在快速迭代项目时,Jib 可以节省每次构建的宝贵时间,只需将更改的层推送到注册表,而不是整个应用程序。 3.可重现 Jib 支持从您的 Maven 和 Gradle 构建元数据以声明方式构建容器映像,因此只要您的输入保持不变,就可以配置为创建可重现的构建映像。
三、菜鸡上手
关于Jib 大家可以自行查阅,我这里就不过多介绍了(github详细的很)
- 快速开始 (我这里的是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", "你的配置路径")
}
}
- 到这就配完了 为了方便 贴几张官方的解释说明
愿意了解的可自行查询(看完之后发现玩法很多哦 😁)
- 构建 推送
执行gradle命令 DsendCredentialsOverHttp 默认是false 会校验http发送 因为我这里是本地执行 自己玩的 不涉及安全这些 直接改成true
./gradlew jib -DsendCredentialsOverHttp=true
总结
Jib 可用作Maven和Gradle的插件,并且只需要极少的配置。只需将插件添加到您的构建定义并配置目标镜像即可 简单实用高效 感兴趣的可以去github上看看 对java开发那是真香