我创建了一个Dockerfile来原生地用GraalVm构建我的 Spring 启动项目;一切都很顺利。
这是Dockerfile
FROM ghcr.io/graalvm/graalvm-ce:22.3.1 AS buildnative
WORKDIR /app
COPY mvnw pom.xml ./
COPY .mvn/ .mvn
COPY src ./src
RUN ./mvnw clean package -Pnative
FROM ubuntu:23.04
EXPOSE 8080
COPY --from=buildnative /app/target/spring-boot-project /build/app
CMD ["/build/app"]
这在本地运行得很完美,但在GitLab runner中,我总是遇到同样的错误。
JAVA_HOME is not defined correctly.
We cannot execute /opt/graalvm-ce-java17-22.3.1/bin/java
The command '/bin/sh -c ./mvnw clean package -Pnative' returned a non-zero code: 1
所以我决定在maven Package 器中添加一些日志,下面是我得到的结果:
Step 7/11 : RUN ./mvnw clean package -Pnative ---> Running in 81e0558130f3 ------------> /opt/graalvm-ce-java17-22.3.1/bin/java ------------> JAVA_HOME is /opt/graalvm-ce-java17-22.3.1 Error: JAVA_HOME is not defined correctly. We cannot execute /opt/graalvm-ce-java17-22.3.1/bin/java The command '/bin/sh -c ./mvnw clean package -Pnative' returned a non-zero code: 1 Cleaning up project directory and file based variables
Step 7/11 : RUN ./mvnw clean package -Pnative
---> Running in 81e0558130f3
------------> /opt/graalvm-ce-java17-22.3.1/bin/java
------------> JAVA_HOME is /opt/graalvm-ce-java17-22.3.1
Error: JAVA_HOME is not defined correctly.
We cannot execute /opt/graalvm-ce-java17-22.3.1/bin/java
The command '/bin/sh -c ./mvnw clean package -Pnative' returned a non-zero code: 1
Cleaning up project directory and file based variables
在我添加的日志中,我们可以看到JAVA_HOME
已经定义,并且定义得很充分,这与本地相同,在本地,一切都运行得很完美。
我试着加上这句话:RUN chmod +x mvnw
之前运行它,但它没有改变任何东西。
我需要更多的想法。有人知道发生了什么吗?
- 编辑:**
我决定更深入地研究这个问题。我已经添加了日志来了解它不起作用的原因。我修改了mvnw脚本来了解发生了什么。
我已将此添加到mvnw
if [ -e "$JAVACMD" ] ; then
echo "------------> THE FILE EXIST" >&2
else
echo "------------> THE FILE DOES NOT EXIST" >&2
fi
if [ -x "$JAVACMD" ] ; then
echo "------------> THE FILE IS EXECUTABLE" >&2
else
echo "------------> THE FILE IS NOT EXECUTABLE" >&2
fi
- 结果:**
以下是本地版本:
------------> JAVACMD /opt/graalvm-ce-java17-22.3.1/bin/java
------------> THE FILE EXIST
------------> THE FILE IS EXECUTABLE
下面是gitlab-runner中的内容:
------------> JAVACMD /opt/graalvm-ce-java17-22.3.1/bin/java
------------> THE FILE EXIST
------------> THE FILE IS NOT EXECUTABLE
对我来说毫无意义
1条答案
按热度按时间igetnqfo1#
正确的编译命令为
你可以在这里看到更多的细节和完整的文档。之后你会在日志中看到graalvm的构建结果。所以你需要像下面这样修改你的docker文件
本地生成的生成日志示例