我有一个Dockerfile,包含以下内容:
FROM gradle:6.9.1-jdk17 as builder
COPY services/api/build.gradle.kts ./
COPY services/api/src ./
COPY services/api/settings.gradle.kts ./
RUN gradle build --no-daemon
FROM openjdk:8-jre-slim
COPY --from=builder /home/* /home
ENTRYPOINT [ "java", "-jar", "./home/build/libs/api.jar" ]当我使用COPY --from=builder /home/* /home从builder复制时,它没有任何问题,如果我用sh进入图像,我可以看到home文件夹中有一个文件夹结构,包括build/libs/api.jar。然而,我只想复制JAR文件,所以我想运行COPY --from=builder /home/build/libs/api.jar .,它应该允许我简单地调用ENTRYPOINT [ "java", "-jar", "./api.jar" ],而不是完全限定的ENTRYPOINT [ "java", "-jar", "./home/build/libs/api.jar" ]。
其次,当我尝试运行镜像时,容器显示为Error: Could not find or load main class com.library.api.MainKt。因此,我尝试使用我在dockerfile中运行的gradle build --no-daemon命令在本地构建api.jar文件,并减少dockerfile的内容,以简单地从本地构建文件夹复制该文件(完全省略gradle构建),并且可以完美地运行它。
在这个问题上,我简直要抓狂了。我的直觉告诉我gradle在dockerfile中构建jar的方式与在我的机器上不同,但版本是相同的,我正在努力寻找还有什么不同之处。
作为参考,我的build.gradle.kts内容如下:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.4.31"
kotlin("plugin.serialization") version "1.4.31"
}
group "com.cabanta"
repositories {
mavenCentral()
}
dependencies {
...
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "15"
}
tasks.withType<Jar> {
manifest {
attributes["Main-Class"] = "com.library.api.MainKt"
}
exclude("META-INF/*.RSA", "META-INF/*.SF", "META-INF/*.DSA")
// To add all of the dependencies otherwise a "NoClassDefFoundError" error
from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
}如果你还需要任何东西来回答,请让我知道。
提前感谢你们这些优秀的人所能给予的任何帮助。
最后一条相关信息可能是我的主类没有类,它只有一个main()作为函数(在Kotlin中应该是允许的,正如我所说的,当在本地机器上运行gradle时,它构建并工作)
发布于 2021-10-14 10:00:29
问题原来是我将文件从本地复制到gradle步骤的方式。
COPY services/api/build.gradle.kts ./
COPY services/api/src ./
COPY services/api/settings.gradle.kts ./现在,我已经更改为COPY services/api/* ./,它会复制所需的所有构建文件。
之前的API正在创建,但是它是在没有任何内容的情况下创建的,这意味着Java无法找到这个类……因为它从一开始就不存在。
https://stackoverflow.com/questions/69558908
复制相似问题