From 0a7997fe805dff7246d7fc332b5e6e6dd1ff295f Mon Sep 17 00:00:00 2001 From: nscuro Date: Sun, 8 Mar 2026 18:13:42 +0100 Subject: [PATCH] Support reuse of dev containers Allows database state to be reused across restarts, and more generally makes startup faster. Signed-off-by: nscuro --- .../java/org/dependencytrack/dev/DevServices.java | 11 +++++++++-- apiserver/src/main/resources/application.properties | 8 ++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/apiserver/src/main/java/org/dependencytrack/dev/DevServices.java b/apiserver/src/main/java/org/dependencytrack/dev/DevServices.java index c47f77badc..659d0cf31d 100644 --- a/apiserver/src/main/java/org/dependencytrack/dev/DevServices.java +++ b/apiserver/src/main/java/org/dependencytrack/dev/DevServices.java @@ -43,6 +43,7 @@ public class DevServices implements AutoCloseable { private final Config config = ConfigProvider.getConfig(); private AutoCloseable postgresContainer; private AutoCloseable frontendContainer; + private boolean isContainerReuseEnabled; public void start() { if (!config.getValue("dt.dev.services.enabled", boolean.class)) { @@ -57,6 +58,8 @@ public void start() { throw new IllegalStateException("Dev services are not available for production builds"); } + isContainerReuseEnabled = config.getValue("dev.services.container-reuse-enabled", boolean.class); + // Infer database port and name from the JDBC URL of the primary data source. final URI defaultDataSourceUri = URI.create( config.getValue("dt.datasource.default.url", String.class).replaceFirst("^jdbc:", "").split("\\?", 2)[0]); @@ -86,12 +89,16 @@ public void start() { postgresContainerClass.getMethod("withPassword", String.class).invoke(postgresContainer, postgresPassword); postgresContainerClass.getMethod("withDatabaseName", String.class).invoke(postgresContainer, postgresDatabase); postgresContainerClass.getMethod("withUrlParam", String.class, String.class).invoke(postgresContainer, "reWriteBatchedInserts", "true"); + postgresContainerClass.getMethod("withLabel", String.class, String.class).invoke(postgresContainer, "owner", "hyades-apiserver-dev"); + postgresContainerClass.getMethod("withReuse", boolean.class).invoke(postgresContainer, isContainerReuseEnabled); addFixedExposedPortMethod.invoke(postgresContainer, /* hostPort */ postgresPort, /* containerPort */ 5432); final Constructor genericContainerConstructor = genericContainerClass.getDeclaredConstructor(String.class); frontendContainer = (AutoCloseable) genericContainerConstructor.newInstance(config.getValue(DEV_SERVICES_IMAGE_FRONTEND.getPropertyName(), String.class)); genericContainerClass.getMethod("withEnv", String.class, String.class).invoke(frontendContainer, "API_BASE_URL", "http://localhost:8080"); genericContainerClass.getMethod("withExposedPorts", Integer[].class).invoke(frontendContainer, (Object) new Integer[]{8080}); + genericContainerClass.getMethod("withLabel", String.class, String.class).invoke(frontendContainer, "owner", "hyades-apiserver-dev"); + genericContainerClass.getMethod("withReuse", boolean.class).invoke(frontendContainer, isContainerReuseEnabled); addFixedExposedPortMethod.invoke(frontendContainer, /* hostPort */ frontendPort, /* containerPort */ 8080); if (config.getValue(DEV_SERVICES_IMAGE_FRONTEND.getPropertyName(), String.class).endsWith(":snapshot")) { genericContainerClass.getMethod("withImagePullPolicy", imagePullPolicyClass).invoke(frontendContainer, alwaysPullPolicy); @@ -110,7 +117,7 @@ public void start() { @Override public void close() { - if (postgresContainer != null) { + if (postgresContainer != null && !isContainerReuseEnabled) { LOGGER.info("Stopping postgres container"); try { postgresContainer.close(); @@ -118,7 +125,7 @@ public void close() { LOGGER.error("Failed to stop PostgreSQL container", e); } } - if (frontendContainer != null) { + if (frontendContainer != null && !isContainerReuseEnabled) { LOGGER.info("Stopping frontend container"); try { frontendContainer.close(); diff --git a/apiserver/src/main/resources/application.properties b/apiserver/src/main/resources/application.properties index 9edce87147..23f568f569 100644 --- a/apiserver/src/main/resources/application.properties +++ b/apiserver/src/main/resources/application.properties @@ -1194,6 +1194,14 @@ dt.init.and.exit=false # @type: boolean dt.dev.services.enabled=false +# Defines whether dev services containers should be reused. +#

+# Refer to for details. +# +# @category: Development +# @type: boolean +dev.services.container-reuse-enabled=true + # The image to use for the frontend dev services container. # # @category: Development