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