quarkusio/quarkus · error · RuntimeException

The native binary produced by the build is not a Linux binar

Error message

The native binary produced by the build is not a Linux binary and therefore cannot be used in a Linux container image. Consider adding "quarkus.native.container-build=true" to your configuration.

What it means

When building a container image from a native binary with Jib, Quarkus checks that the native binary is a Linux executable, since the container image is Linux-based. If the binary was built for the local OS (macOS/Windows), Jib cannot package it, so the build throws this RuntimeException suggesting quarkus.native.container-build=true.

Source

Thrown at extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java:229

    public void buildFromNative(ContainerImageConfig containerImageConfig, ContainerImageJibConfig jibConfig,
            ContainerImageInfoBuildItem containerImage,
            NativeImageBuildItem nativeImage,
            OutputTargetBuildItem outputTarget,
            Optional<ContainerImageBuildRequestBuildItem> buildRequest,
            Optional<ContainerImagePushRequestBuildItem> pushRequest,
            List<ContainerImageLabelBuildItem> containerImageLabels,
            Optional<UpxCompressedBuildItem> upxCompressed, // used to ensure that we work with the compressed native binary if compression was enabled
            BuildProducer<ArtifactResultBuildItem> artifactResultProducer,
            BuildProducer<ContainerImageBuilderBuildItem> containerImageBuilder) {

        boolean buildContainerImage = buildContainerImageNeeded(containerImageConfig, buildRequest);
        boolean pushContainerImage = pushContainerImageNeeded(containerImageConfig, pushRequest);
        if (!buildContainerImage && !pushContainerImage) {
            return;
        }

        if (!NativeBinaryUtil.nativeIsLinuxBinary(nativeImage)) {
            throw new RuntimeException(
                    "The native binary produced by the build is not a Linux binary and therefore cannot be used in a Linux container image. Consider adding \"quarkus.native.container-build=true\" to your configuration");
        }

        JibContainerBuilder jibContainerBuilder = createContainerBuilderFromNative(jibConfig, containerImageConfig,
                nativeImage, containerImageLabels);
        setUser(jibConfig, jibContainerBuilder);
        setPlatforms(jibConfig, jibContainerBuilder);
        handleExtraFiles(outputTarget, jibContainerBuilder);

        log.info("Starting (local) container image build for native binary using jib.");
        JibContainer container = containerize(containerImageConfig, jibConfig, containerImage, jibContainerBuilder,
                pushContainerImage);
        writeOutputFiles(container, jibConfig, outputTarget);

        artifactResultProducer.produce(new ArtifactResultBuildItem(null, "native-container",
                Map.of("container-image", container.getTargetImage().toString(), "pull-required",
                        "" + pushContainerImage)));
        containerImageBuilder.produce(new ContainerImageBuilderBuildItem(JIB));

View on GitHub (pinned to e1c734241f)

Solutions

  1. Rebuild with -Dquarkus.native.container-build=true so the native binary is compiled inside a Linux (container) environment
  2. Or perform the native build in a Linux CI runner/container and package with Jib from there
  3. Set quarkus.native.container-build=true persistently in application.properties for local builds intended for containers
  4. Verify the binary with 'file target/*-runner' — it should say 'ELF 64-bit' before running the Jib build

Example fix

# before
./mvnw package -Dnative -Dquarkus.container-image.build=true
# after
./mvnw package -Dnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true
Defensive patterns

Strategy: validation

Validate before calling

Path runner = Path.of("target", "my-app-runner");
String out = new String(ProcessHelpers.exec("file", runner.toString()));
if (!out.contains("ELF")) {
    throw new IllegalStateException("Native binary is not a Linux ELF; rebuild with -Dquarkus.native.container-build=true");
}

Type guard

boolean isLinuxElf(Path binary) throws IOException, InterruptedException {
    Process p = new ProcessBuilder("file", binary.toString()).redirectErrorStream(true).start();
    String out = new String(p.getInputStream().readAllBytes());
    p.waitFor();
    return out.contains("ELF");
}

Try / catch

try {
    jibNativeBuild();
} catch (RuntimeException e) {
    if (e.getMessage() != null && e.getMessage().contains("not a Linux binary")) {
        throw new IllegalStateException("Rebuild with quarkus.native.container-build=true before Jib packaging", e);
    }
    throw e;
}

Prevention

When it happens

Trigger: Building natively on macOS or Windows without -Dquarkus.native.container-build=true, then running a Jib container-image build (quarkus.container-image.build=true with the jib extension) from the produced binary.

Common situations: Local Mac/Windows native builds followed by Jib packaging; CI pipelines where the native step missed container-build; switching from docker to jib extension without changing the native build setup.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/45a852616dfa069f. Report an issue: GitHub.