【发布时间】:2021-07-31 20:38:12
【问题描述】:
我想使用带有 Gradle 的 Jib 将我的 Spring Boot 应用程序打包为 Docker 容器。
更多 除了关注Jib's readme,我还从一个简单的JHipster 项目中复制了一个示例。你猜怎么了?没用。
好的,这里是代码。
JHipster 生成器创建一个专用的 gradle/docker.gradle 文件,该文件从主 Gradle 构建文件应用,并正在导入 Jib 插件
所以我复制了JH jib文件开始
我的gradle/jib.gradle
jib {
from {
// image = "adoptopenjdk:8-jre"
image = "adoptopenjdk:11-jre-hotspot"
}
to {
image = "myapp:latest"
}
container {
entrypoint = ["bash", "-c", "/entrypoint.sh"]
ports = ["8080"]
environment = [
SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS",
SPRBOOT_SLEEP: "0"
]
creationTime = "USE_CURRENT_TIMESTAMP"
}
extraDirectories {
paths = file("src/main/jib")
permissions = ["/entrypoint.sh": "755"]
}
}
注释部分是因为我想使用 JDK8,但我正在尝试 JHipster 所做的。
其次,我根据 JH 的存储库复制了我自己的 entrypoint.sh。这里是src/main/jib/entrypoint.sh
#!/bin/sh
echo "The application will start in ${SPRBOOT_SLEEP}s..." && sleep "${SPRBOOT_SLEEP}" # Author's note: it's pointless
exec java "${JAVA_OPTS}" -noverify \
-XX:+AlwaysPreTouch \
-Djava.security.egd=file:/dev/./urandom \
-cp /app/resources/:/app/classes/:/app/libs/* \
"com.acme.MyApplication" "$@"
当然,我必须将 jib 插件 3.0.0 添加到我的 Gradle 文件中,应用 jib.gradle 脚本
plugins {
id 'org.springframework.boot' version '2.4.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'war'
id "com.google.cloud.tools.jib" version '3.0.0'
id 'org.unbroken-dome.test-sets' version '3.0.1'
id 'org.flywaydb.flyway' version '7.5.4' apply false
id 'com.telenia.gradle.MybatisGenerator' version '2.1.5'
id 'net.ltgt.apt-eclipse' version '0.21' apply false
}
apply from: 'gradle/jib.gradle'
说明时间
现在我希望gradle jibDockerBuild 在/app 下创建一个包含我的应用程序文件的容器,并使用入口点启动 Spring Boot 可执行文件。我不关心sleep,它是0,是JH继承的
当然,当我从 JHipster 项目构建 Docker 映像时,它就像一个魅力。当我构建自己的容器时,运行它失败并出现经典的 Unable to locate main class 错误
The application will start in 0s...
Error: Could not find or load main class
Caused by: java.lang.ClassNotFoundException:
我尝试将bash 放入容器中,但根本没有/app 目录。 JHipster 构建的容器下有一个/app 目录。
尝试检查这两个图像在写这篇文章时,我发现了一些不同之处。 JHipster 在/app 下部署文件,而我的Gradle 脚本在/var/lib/jetty/webapps/ROOT 下部署jar。我的应用程序始终启用 war 插件,而 JHipster 仅在设置了 -Pwar 变量时才启用插件。
我不关心在图像中使用战争或嵌入式服务器,只要结果是生产级的。我仍然需要能够构建一个战争文件。
问题
如何正确配置现有的基于 Gradle 的 Spring Boot 项目以使用 Jib 构建为 Docker 容器?鉴于我优先考虑基于 Spring Boot 的 JHipster 的现有代码,我的代码有什么问题?
编辑 1
酷:在 JHipster 项目中,gradle -Pwar jibDockerBuild 在容器内部署/jetty/webapps 下的文件,当我启动应用程序时,我得到了神奇的错误Could not find or load main class
【问题讨论】:
标签: spring-boot gradle jib