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
- Rebuild with -Dquarkus.native.container-build=true so the native binary is compiled inside a Linux (container) environment
- Or perform the native build in a Linux CI runner/container and package with Jib from there
- Set quarkus.native.container-build=true persistently in application.properties for local builds intended for containers
- 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
- Set quarkus.native.container-build=true whenever the container image is built from a native binary
- Confirm with 'file target/*-runner' that the output is ELF before Jib packaging
- Build native binaries in Linux environments (CI runners or in-container builds)
- Document the container-build flag in project build instructions for macOS/Windows developers
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
- The native binary produced by the build is not a Linux binar
- Cannot parse version from output: ${stringOutput}
- Could not find builder image '${effectiveBuilderImage}' loca
- Not Implemented in native mode
- Unable to create new instance for ${clazz}
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/45a852616dfa069f.
Report an issue: GitHub.