diff --git a/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibConfig.java b/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibConfig.java index 4e4f3feef122e4..11f280b2e4f4a6 100644 --- a/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibConfig.java +++ b/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibConfig.java @@ -35,6 +35,46 @@ public class JibConfig { @ConfigItem(defaultValue = "-Dquarkus.http.host=0.0.0.0") public List nativeArguments; + /** + * If this is set, then it will be used as the entry point of the container image. + * There are a few things to be aware of when creating an entry point + * + * + * When this is not set, a proper default entrypoint will be constructed. + * + * As a final note, a very useful tool for inspecting container image layers that can greatly aid + * when debugging problems with endpoints is dive + */ + @ConfigItem + public Optional> jvmEntrypoint; + + /** + * If this is set, then it will be used as the entry point of the container image. + * There are a few things to be aware of when creating an entry point + * + * + * When this is not set, a proper default entrypoint will be constructed. + * + * As a final note, a very useful tool for inspecting container image layers that can greatly aid + * when debugging problems with endpoints is dive + */ + @ConfigItem + public Optional> nativeEntrypoint; + /** * Environment variables to add to the container image */ diff --git a/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java b/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java index 88b17e06108f24..384c7eefa93400 100644 --- a/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java +++ b/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java @@ -254,11 +254,17 @@ private JibContainerBuilder createContainerBuilderFromFastJar(JibConfig jibConfi Path componentsPath = sourceJarBuildItem.getPath().getParent().getParent(); AbsoluteUnixPath workDirInContainer = AbsoluteUnixPath.get("/work"); - List entrypoint = new ArrayList<>(3 + jibConfig.jvmArguments.size()); - entrypoint.add("java"); - entrypoint.addAll(jibConfig.jvmArguments); - entrypoint.add("-jar"); - entrypoint.add("quarkus-run.jar"); + + List entrypoint; + if (jibConfig.jvmEntrypoint.isPresent()) { + entrypoint = jibConfig.jvmEntrypoint.get(); + } else { + entrypoint = new ArrayList<>(3 + jibConfig.jvmArguments.size()); + entrypoint.add("java"); + entrypoint.addAll(jibConfig.jvmArguments); + entrypoint.add("-jar"); + entrypoint.add(JarResultBuildStep.QUARKUS_RUN_JAR); + } try { return Jib.from(toRegistryImage(ImageReference.parse(jibConfig.baseJvmImage), jibConfig.baseRegistryUsername, @@ -293,9 +299,15 @@ private JibContainerBuilder createContainerBuilderFromLegacyJar(JibConfig jibCon .from(toRegistryImage(ImageReference.parse(jibConfig.baseJvmImage), jibConfig.baseRegistryUsername, jibConfig.baseRegistryPassword)) .addResources(classesDir, IS_CLASS_PREDICATE.negate()) - .addClasses(classesDir, IS_CLASS_PREDICATE) - .addJvmFlags(jibConfig.jvmArguments) - .setMainClass(mainClassBuildItem.getClassName()); + .addClasses(classesDir, IS_CLASS_PREDICATE); + + // when there is no custom entry point, we just set everything up for a regular java run + if (!jibConfig.jvmEntrypoint.isPresent()) { + javaContainerBuilder + .addJvmFlags(jibConfig.jvmArguments) + .setMainClass(mainClassBuildItem.getClassName()); + } + if (sourceJarBuildItem.getLibraryDir() != null) { javaContainerBuilder .addDependencies( @@ -305,10 +317,16 @@ private JibContainerBuilder createContainerBuilderFromLegacyJar(JibConfig jibCon .collect(Collectors.toList())); } - return javaContainerBuilder.toContainerBuilder() + JibContainerBuilder jibContainerBuilder = javaContainerBuilder.toContainerBuilder() .setEnvironment(jibConfig.environmentVariables) .setLabels(allLabels(jibConfig, containerImageLabels)) .setCreationTime(Instant.now()); + + if (jibConfig.jvmEntrypoint.isPresent()) { + jibContainerBuilder.setEntrypoint(jibConfig.jvmEntrypoint.get()); + } + + return jibContainerBuilder; } catch (IOException e) { throw new UncheckedIOException(e); } catch (InvalidImageReferenceException e) { @@ -318,9 +336,15 @@ private JibContainerBuilder createContainerBuilderFromLegacyJar(JibConfig jibCon private JibContainerBuilder createContainerBuilderFromNative(ContainerImageConfig containerImageConfig, JibConfig jibConfig, NativeImageBuildItem nativeImageBuildItem, List containerImageLabels) { - List entrypoint = new ArrayList<>(jibConfig.nativeArguments.size() + 1); - entrypoint.add("./" + BINARY_NAME_IN_CONTAINER); - entrypoint.addAll(jibConfig.nativeArguments); + + List entrypoint; + if (jibConfig.nativeEntrypoint.isPresent()) { + entrypoint = jibConfig.nativeEntrypoint.get(); + } else { + entrypoint = new ArrayList<>(jibConfig.nativeArguments.size() + 1); + entrypoint.add("./" + BINARY_NAME_IN_CONTAINER); + entrypoint.addAll(jibConfig.nativeArguments); + } try { AbsoluteUnixPath workDirInContainer = AbsoluteUnixPath.get("/work"); return Jib