Closed kamilgregorczyk closed 4 years ago
Hi @kamilgregorczyk and thanks for reporting this issue!
Unfortunately, that very long stack trace doesn't contain the failure cause. Would it be possible for you to provide us with a minimal reproducer? If the build fails with a project right after its creation using the web wizard, another possibility would be to describe here the exact list of extensions you selected.
I generated a project with no deps and the only thing I changed is java version in Gradle:
plugins {
id 'java'
id 'io.quarkus'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
implementation 'io.quarkus:quarkus-resteasy'
testImplementation 'io.quarkus:quarkus-junit5'
testImplementation 'io.rest-assured:rest-assured'
}
group 'org.acme'
version '1.0.0-SNAPSHOT'
compileJava {
options.compilerArgs << '-parameters'
}
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
Thanks!
Could you try running the build with the following command?
./gradlew buildNative --docker-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11
Quarkus 1.2.0.Final
supports both GraalVM 19.2.1
(not compatible with Java 11) and 19.3.1
(compatible with Java 11). When you build a project using ./gradlew buildNative --docker-build=true
, Quarkus uses by default a Docker image containing GraalVM 19.2.1
. I'm pretty sure that's the reason of the failure you experienced.
We should probably document the -Dquarkus.native.builder-image
option in the guides until the Java 8 support is dropped in Quarkus, I'll submit a PR to fix that.
Worked! thanks:) I have one more question, is quarkus/graalvm compatible with arm64? I managed to make arm + amd JVM image like here: https://hub.docker.com/repository/docker/uniqe15/quarkus but creating the same image for AMD and arm with native image like here https://hub.docker.com/repository/docker/uniqe15/quarkus2 seems to create images in wrong format. Is there anything special in creating arm based native images?
I'm using new docker build to do multi arch images docker buildx build --platform linux/amd64,linux/arm64 --push -t uniqe15/quarkus2 .
I know there's a GraalVM version dedicated to ARM64 and that we don't provide a Docker image for this version. I'd say it's possible to run Quarkus in native mode using a local ARM64 GraalVM installation but I've never tried it myself.
@dmlloyd Would you have the answer to that question?
Thanks!
Could you try running the build with the following command?
./gradlew buildNative --docker-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11
Quarkus
1.2.0.Final
supports both GraalVM19.2.1
(not compatible with Java 11) and19.3.1
(compatible with Java 11). When you build a project using./gradlew buildNative --docker-build=true
, Quarkus uses by default a Docker image containing GraalVM19.2.1
. I'm pretty sure that's the reason of the failure you experienced.
Hi ... I stumbled over the same issue yesterday also solving that with the quarkus.native.builder-image setting. Looking at the quarks core code I saw that 19.3 is set there as default ConfigItem. I have uninstalled 19.2 native-image and only latest graalvm 19.3 on my machine but somehow still the "older" version is used when I don't set the build-image property.
Hi @wfrank2509. If you looked at the code from the current Quarkus master
branch, then you probably saw a code that was updated since the 1.2.0.Final
release.
In Quarkus 1.2.0.Final
, the default Docker image contained GraalVM 19.2.1
(Java 8 only).
Today (and in the future 1.3.0.Final
release), the default image contains GraalVM 19.3.1
(Java 8 edition).
In both cases, if you want to build a Java 11 native image, you have to use -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11
.
@gwenneg If I get it correctly, the image quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11 has no arm version but the raw one from graal has?
I know there's a GraalVM version dedicated to ARM64 and that we don't provide a Docker image for this version. I'd say it's possible to run Quarkus in native mode using a local ARM64 GraalVM installation but I've never tried it myself.
@dmlloyd Would you have the answer to that question?
It should work but only on an actual system. In fact, I'll give it a try right now, why not!
I know there's a GraalVM version dedicated to ARM64 and that we don't provide a Docker image for this version. I'd say it's possible to run Quarkus in native mode using a local ARM64 GraalVM installation but I've never tried it myself. @dmlloyd Would you have the answer to that question?
It should work but only on an actual system. In fact, I'll give it a try right now, why not!
It's going to take a while though :slightly_smiling_face:
@dmlloyd Thanks! I have a Kubernetes cluster build on arm64, let me know if you want to test things
@gwenneg If I get it correctly, the image quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11 has no arm version but the raw one from graal has?
@kamilgregorczyk: Sorry, I didn't see your question.
We built the quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11
Docker image using the graalvm-ce-java11-linux-amd64-19.3.1.tar.gz
file that you can find in the GraalVM CE release page.
We don't currently provide any Docker image for the aarch64
version of GraalVM (which should be arm64
-compatible), so if you want one, you will have to build it by yourself for now.
cc @cescoffier
The Maven and Gradle tooling guides have been updated to make things clearer about which Docker image to use depending on the Java version.
I'm leaving this open since it looks like the ARM64 discussion is still in progress.
Yesterday I successfully tried to bring my native compiled Quarkus application to a Raspberry Pi4 running on Ubuntu 64Bit ARM. Multi-stage docker build took nearly 4 hours with ARM emulation (docker buildx tooling) on my MacBook. But startup of the app was in 15ms.
@rmh78 could you walk me through the process ? I’m kind of confused as before building the docket image I guess I need to have a generated binary by gradle in arm64 but I can’t think of any way on how to do that
@kamilgregorczyk I created a multi-stage docker file. So the build of the native executable in done in the first docker stage. This stage uses the oracle graal image which is available for ARM64 too. see https://github.com/rmh78/quarkus-simple/blob/master/src/main/docker/Dockerfile
For docker buildx you have to enable docker experimental features.
This README.md lists all the docker commands you need to call.
FROM oracle/graalvm-ce:19.3.1-java11 AS build
RUN gu install native-image
COPY ./gradlew ./gradlew
COPY ./gradle ./gradle
COPY ./build.gradle ./build.gradle
COPY ./gradle.properties ./gradle.properties
COPY ./settings.gradle ./settings.gradle
RUN ./gradlew buildNative
FROM debian
WORKDIR /work/
COPY build/*-runner /work/application
RUN chmod 775 /work /work/application
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
Weird case, this is marked as arm64 after docker builds but it does not properly execute on arm64 machine, what's also weird is that build took only a minute but if I remove a multistage build (delete FROM debian
) then it takes at least an hour
Describe the bug I created a simple project via the web wizard with Gradle and creating a native image works by running
./gradlew buildNative
but doing the same thing with building docker by running./gradlew buildNative --docker-build=true
does not work, it ends with such error:Expected behavior I expected the native image to be created along with docker one
Actual behavior everything failed
Environment (please complete the following information):
uname -a
orver
:Darwin iMac.local 19.3.0 Darwin Kernel Version 19.3.0: Thu Jan 9 20:58:23 PST 2020; root:xnu-6153.81.5~1/RELEASE_X86_64 x86_64
java -version
:1.2.0.Final
I have docker running and I'm using Graal for java 11