quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.68k stars 2.65k forks source link

Building native docker image fails due to Failed to augment application classes error #7014

Closed kamilgregorczyk closed 4 years ago

kamilgregorczyk commented 4 years ago

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:

➜  blog ./gradlew buildNative --docker-build=true --stacktrace        

> Task :quarkusBuild
building quarkus runner

> Task :buildNative
building native image

> Task :buildNative FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':buildNative'.
> Failed to generate a native image

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':buildNative'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:187)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:185)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:166)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:374)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:361)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:354)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:340)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.GradleException: Failed to generate a native image
        at io.quarkus.gradle.tasks.QuarkusNative.buildNative(QuarkusNative.java:370)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:721)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:688)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:539)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:524)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:507)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:258)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:247)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:63)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:153)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:67)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:41)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:174)
        ... 30 more
Caused by: io.quarkus.creator.AppCreatorException: Failed to augment application classes
        at io.quarkus.creator.phase.augment.AugmentTask.run(AugmentTask.java:188)
        at io.quarkus.creator.phase.augment.AugmentTask.run(AugmentTask.java:53)
        at io.quarkus.creator.CuratedApplicationCreator.runTask(CuratedApplicationCreator.java:139)
        at io.quarkus.gradle.tasks.QuarkusNative.buildNative(QuarkusNative.java:368)
        ... 95 more
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Failed to build native image
        at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:319)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:915)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:279)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2011)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1535)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1426)
        at java.base/java.lang.Thread.run(Thread.java:834)
        at org.jboss.threads.JBossThread.run(JBossThread.java:479)
Caused by: java.lang.RuntimeException: Image generation failed. Exit code: 1
        at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:308)
        ... 12 more

        at io.quarkus.builder.Execution.run(Execution.java:108)
        at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
        at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:128)
        at io.quarkus.creator.phase.augment.AugmentTask.run(AugmentTask.java:179)
        ... 98 more
Caused by: java.lang.RuntimeException: Failed to build native image
        at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:319)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:915)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:279)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2011)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1535)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1426)
        at org.jboss.threads.JBossThread.run(JBossThread.java:479)
Caused by: java.lang.RuntimeException: Image generation failed. Exit code: 1
        at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:308)
        ... 10 more

* Get more help at https://help.gradle.org

BUILD FAILED in 21s

Expected behavior I expected the native image to be created along with docker one

Actual behavior everything failed

Environment (please complete the following information):

I have docker running and I'm using Graal for java 11

gwenneg commented 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.

kamilgregorczyk commented 4 years ago

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
}
gwenneg commented 4 years ago

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.

gwenneg commented 4 years ago

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.

kamilgregorczyk commented 4 years ago

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 .

gwenneg commented 4 years ago

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?

wfrank2509 commented 4 years ago

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.

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.

gwenneg commented 4 years ago

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.

kamilgregorczyk commented 4 years ago

@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?

dmlloyd commented 4 years ago

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!

dmlloyd commented 4 years ago

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:

kamilgregorczyk commented 4 years ago

@dmlloyd Thanks! I have a Kubernetes cluster build on arm64, let me know if you want to test things

gwenneg commented 4 years ago

@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

gwenneg commented 4 years ago

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.

rmh78 commented 4 years ago

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.

kamilgregorczyk commented 4 years ago

@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

rmh78 commented 4 years ago

@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.

kamilgregorczyk commented 4 years ago
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