From 7d65d5e531f344ab00b6a2df9e624e5640f94c7f Mon Sep 17 00:00:00 2001 From: Miranda Streeter Date: Wed, 24 Jun 2026 00:19:15 -0700 Subject: [PATCH 1/3] Create CDS Archive for JVM app class pre-loading Signed-off-by: Miranda Streeter --- Containerfile.alpine | 12 ++++++++++-- Containerfile.ubuntu | 12 ++++++++++-- openvoxserver/files/container-entrypoint.sh | 9 ++++++--- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Containerfile.alpine b/Containerfile.alpine index b98bbe8..66a0c79 100644 --- a/Containerfile.alpine +++ b/Containerfile.alpine @@ -22,7 +22,7 @@ COPY openvoxserver/prep_build_container.sh / RUN /prep_build_container.sh ################################################################################ -FROM base AS final +FROM base AS app # renovate: datasource=rubygems depName=hiera-eyaml ARG RUBYGEM_HIERA_EYAML=5.0.1 @@ -79,7 +79,7 @@ ENV AUTOSIGN=true \ OPENVOXSERVER_GRAPHITE_HOST=exporter \ OPENVOXSERVER_GRAPHITE_PORT=9109 \ OPENVOXSERVER_HOSTNAME="" \ - OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m" \ + OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:SharedArchiveFile=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ OPENVOXSERVER_MAX_ACTIVE_INSTANCES=1 \ OPENVOXSERVER_MAX_REQUESTS_PER_INSTANCE=0 \ OPENVOXSERVER_PORT=8140 \ @@ -106,6 +106,14 @@ RUN /prep_release_container.sh USER puppet:0 +# Create a CDS archive in a stage for faster class loading. +FROM app AS cds +RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ + timeout 60 dumb-init /container-entrypoint.sh foreground || true + +FROM app AS final +COPY --from=cds /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa + # k8s uses livenessProbe, startupProbe, readinessProbe and ignores HEALTHCHECK HEALTHCHECK --interval=20s --timeout=15s --retries=12 --start-period=3m CMD ["/healthcheck.sh"] diff --git a/Containerfile.ubuntu b/Containerfile.ubuntu index 0333c36..90b9d7f 100644 --- a/Containerfile.ubuntu +++ b/Containerfile.ubuntu @@ -31,7 +31,7 @@ COPY openvoxserver/prep_build_container.sh / RUN /prep_build_container.sh ################################################################################ -FROM base AS final +FROM base AS app # renovate: datasource=rubygems depName=hiera-eyaml ARG RUBYGEM_HIERA_EYAML=5.0.1 @@ -88,7 +88,7 @@ ENV AUTOSIGN=true \ OPENVOXSERVER_GRAPHITE_HOST=exporter \ OPENVOXSERVER_GRAPHITE_PORT=9109 \ OPENVOXSERVER_HOSTNAME="" \ - OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m" \ + OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:SharedArchiveFile=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ OPENVOXSERVER_MAX_ACTIVE_INSTANCES=1 \ OPENVOXSERVER_MAX_REQUESTS_PER_INSTANCE=0 \ OPENVOXSERVER_PORT=8140 \ @@ -115,6 +115,14 @@ RUN /prep_release_container.sh USER puppet:0 +# Create a CDS archive in a stage for faster class loading. +FROM app AS cds +RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ + timeout 60 dumb-init /container-entrypoint.sh foreground || true + +FROM app AS final +COPY --from=cds /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa + # k8s uses livenessProbe, startupProbe, readinessProbe and ignores HEALTHCHECK HEALTHCHECK --interval=20s --timeout=15s --retries=12 --start-period=3m CMD ["/healthcheck.sh"] diff --git a/openvoxserver/files/container-entrypoint.sh b/openvoxserver/files/container-entrypoint.sh index cb43f7f..aed8448 100755 --- a/openvoxserver/files/container-entrypoint.sh +++ b/openvoxserver/files/container-entrypoint.sh @@ -87,17 +87,20 @@ post_execution_handler() { ## Sigterm Handler # shellcheck disable=SC2317 # function is called when the container receives a SIGTERM signal +# We're forwarding the sigterm to the child JVM process (/usr/bin/java) instead of the +# wrapper script (/opt/puppetlabs/server/apps/puppetserver/cli/apps/foreground), else it +# doesn't shut down gracefully. sigterm_handler() { echoerr "Catching SIGTERM" if [ $pid -ne 0 ]; then - echoerr "sigterm_handler for PID '${pid}' triggered" + echoerr "sigterm_handler triggered, shutting down service" # the above if statement is important because it ensures # that the application has already started. without it you # could attempt cleanup steps if the application failed to # start, causing errors. run_custom_handler sigterm-handler - kill -15 "$pid" - wait "$pid" + pkill -TERM -f puppet-server-release.jar + while pgrep -f puppet-server-release.jar > /dev/null; do sleep 1; done post_execution_handler fi exit 143; # 128 + 15 -- SIGTERM From ad42345b71c9050a4cd29fec607b04f38f8fc999 Mon Sep 17 00:00:00 2001 From: Miranda Streeter Date: Thu, 25 Jun 2026 12:48:38 -0700 Subject: [PATCH 2/3] Check for exit codes rather than swallow them Signed-off-by: Miranda Streeter --- Containerfile.alpine | 2 +- Containerfile.ubuntu | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Containerfile.alpine b/Containerfile.alpine index 66a0c79..24e4c1f 100644 --- a/Containerfile.alpine +++ b/Containerfile.alpine @@ -109,7 +109,7 @@ USER puppet:0 # Create a CDS archive in a stage for faster class loading. FROM app AS cds RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ - timeout 60 dumb-init /container-entrypoint.sh foreground || true + timeout --preserve-status 60 dumb-init /container-entrypoint.sh foreground || [ $? -eq 143 ] FROM app AS final COPY --from=cds /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa diff --git a/Containerfile.ubuntu b/Containerfile.ubuntu index 90b9d7f..d7c90bf 100644 --- a/Containerfile.ubuntu +++ b/Containerfile.ubuntu @@ -118,7 +118,7 @@ USER puppet:0 # Create a CDS archive in a stage for faster class loading. FROM app AS cds RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ - timeout 60 dumb-init /container-entrypoint.sh foreground || true + timeout --preserve-status 60 dumb-init /container-entrypoint.sh foreground || [ $? -eq 143 ] FROM app AS final COPY --from=cds /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa /opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa From 21242a69b02d9845ec5d0529f8ae5b6469a10574 Mon Sep 17 00:00:00 2001 From: Miranda Streeter Date: Thu, 25 Jun 2026 19:05:24 -0700 Subject: [PATCH 3/3] Disable cds logging to avoid noise from JDK-8314250 Signed-off-by: Miranda Streeter --- Containerfile.alpine | 2 +- Containerfile.ubuntu | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Containerfile.alpine b/Containerfile.alpine index 7d61b92..f88fbbf 100644 --- a/Containerfile.alpine +++ b/Containerfile.alpine @@ -108,7 +108,7 @@ USER puppet:0 # Create a CDS archive in a stage for faster class loading. FROM app AS cds -RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ +RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa -Xlog:cds=off" \ timeout --preserve-status 60 dumb-init /container-entrypoint.sh foreground || [ $? -eq 143 ] FROM app AS final diff --git a/Containerfile.ubuntu b/Containerfile.ubuntu index 2bd6fab..1fbeb2d 100644 --- a/Containerfile.ubuntu +++ b/Containerfile.ubuntu @@ -117,7 +117,7 @@ USER puppet:0 # Create a CDS archive in a stage for faster class loading. FROM app AS cds -RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa" \ +RUN OPENVOXSERVER_JAVA_ARGS="-Xms1024m -Xmx1024m -XX:ArchiveClassesAtExit=/opt/puppetlabs/server/apps/puppetserver/puppetserver.jsa -Xlog:cds=off" \ timeout --preserve-status 60 dumb-init /container-entrypoint.sh foreground || [ $? -eq 143 ] FROM app AS final