> sectio
====
[source,bash,subs=attributes+]
----
-docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-docker-image} start-dev
+docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-image} start-dev
----
====
. You can access your Keycloak server at http://localhost:8180[localhost:8180].
diff --git a/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc b/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc
index 71ef99baa09af..18481b8dc17c9 100644
--- a/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc
+++ b/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc
@@ -198,7 +198,7 @@ To start a Keycloak server, use Docker and run the following command:
[source,bash,subs=attributes+]
----
-docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-docker-image} start-dev
+docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-image} start-dev
----
You can access your Keycloak Server at http://localhost:8180[localhost:8180].
diff --git a/docs/src/main/asciidoc/security-openid-connect-client.adoc b/docs/src/main/asciidoc/security-openid-connect-client.adoc
index db5f8fea0b6d5..9d5e3d7d4e079 100644
--- a/docs/src/main/asciidoc/security-openid-connect-client.adoc
+++ b/docs/src/main/asciidoc/security-openid-connect-client.adoc
@@ -502,7 +502,7 @@ To start a Keycloak Server, you can use Docker and just run the following comman
[source,bash,subs=attributes+]
----
-docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-docker-image} start-dev
+docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-image} start-dev
----
You can access your Keycloak Server at http://localhost:8180[localhost:8180].
diff --git a/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc b/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc
index bcdd4e0d336cd..b759b6d48bd40 100644
--- a/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc
+++ b/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc
@@ -247,7 +247,7 @@ For more information, see xref:security-oidc-bearer-token-authentication.adoc#be
[[keycloak-initialization]]
=== Keycloak initialization
-The `{keycloak-docker-image}` image which contains a Keycloak distribution powered by Quarkus is used to start a container by default.
+The `{keycloak-image}` image which contains a Keycloak distribution powered by Quarkus is used to start a container by default.
`quarkus.keycloak.devservices.image-name` can be used to change the Keycloak image name.
For example, set it to `quay.io/keycloak/keycloak:19.0.3-legacy` to use a Keycloak distribution powered by WildFly.
Be aware that a Quarkus-based Keycloak distribution is only available starting from Keycloak `20.0.0`.
diff --git a/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc b/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc
index 3e3a77bd9be07..bb49fb382a9cf 100644
--- a/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc
+++ b/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc
@@ -343,7 +343,7 @@ To start a Keycloak server, you can use Docker and run the following command:
[source,bash,subs=attributes+]
----
-docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-docker-image} start-dev
+docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 {keycloak-image} start-dev
----
Access your Keycloak server at http://localhost:8180[localhost:8180].
diff --git a/docs/src/main/asciidoc/spring-data-jpa.adoc b/docs/src/main/asciidoc/spring-data-jpa.adoc
index 1e5ec05f38791..5d5215c47afb0 100644
--- a/docs/src/main/asciidoc/spring-data-jpa.adoc
+++ b/docs/src/main/asciidoc/spring-data-jpa.adoc
@@ -139,9 +139,9 @@ This configuration assumes that PostgreSQL will be running locally.
A very easy way to accomplish that is by using the following Docker command:
-[source,bash]
+[source,bash,subs=attributes+]
----
-docker run -it --rm=true --name quarkus_test -e POSTGRES_USER=quarkus_test -e POSTGRES_PASSWORD=quarkus_test -e POSTGRES_DB=quarkus_test -p 5432:5432 postgres:14.1
+docker run -it --rm=true --name quarkus_test -e POSTGRES_USER=quarkus_test -e POSTGRES_PASSWORD=quarkus_test -e POSTGRES_DB=quarkus_test -p 5432:5432 {postgres-image}
----
If you plan on using a different setup, please change your `application.properties` accordingly.
diff --git a/docs/src/main/asciidoc/spring-data-rest.adoc b/docs/src/main/asciidoc/spring-data-rest.adoc
index 65047c5991897..0b40ec408212f 100644
--- a/docs/src/main/asciidoc/spring-data-rest.adoc
+++ b/docs/src/main/asciidoc/spring-data-rest.adoc
@@ -158,9 +158,9 @@ This configuration assumes that PostgreSQL will be running locally.
A very easy way to accomplish that is by using the following Docker command:
-[source,bash]
+[source,bash,subs=attributes+]
----
-docker run -it --rm=true --name quarkus_test -e POSTGRES_USER=quarkus_test -e POSTGRES_PASSWORD=quarkus_test -e POSTGRES_DB=quarkus_test -p 5432:5432 postgres:14.1
+docker run -it --rm=true --name quarkus_test -e POSTGRES_USER=quarkus_test -e POSTGRES_PASSWORD=quarkus_test -e POSTGRES_DB=quarkus_test -p 5432:5432 {postgres-image}
----
If you plan on using a different setup, please change your `application.properties` accordingly.
diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java
index 6d96e50df3830..adc649c2fed52 100644
--- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java
+++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java
@@ -26,8 +26,19 @@ public interface DevServicesBuildTimeConfig {
/**
* The container image name for container-based Dev Service providers.
- *
+ *
* This has no effect if the provider is not a container-based database, such as H2 or Derby.
+ *
+ * Defaults depend on the configured `datasource`:
+ *
+ * * DB2: `{db2-image}`
+ * * MariaDB: `{mariadb-image}`
+ * * Microsoft SQL Server: `{mssql-image}`
+ * * MySQL: `{mysql-image}`
+ * * Oracle Express Edition: `{oracle-image}`
+ * * PostgreSQL: `{postgres-image}`
+ *
+ * @asciidoclet
*/
Optional<@WithConverter(TrimmedStringConverter.class) String> imageName();
diff --git a/extensions/devservices/keycloak/src/main/java/io/quarkus/devservices/keycloak/KeycloakDevServicesConfig.java b/extensions/devservices/keycloak/src/main/java/io/quarkus/devservices/keycloak/KeycloakDevServicesConfig.java
index aeef5f2dde1d5..3b51ab3133ada 100644
--- a/extensions/devservices/keycloak/src/main/java/io/quarkus/devservices/keycloak/KeycloakDevServicesConfig.java
+++ b/extensions/devservices/keycloak/src/main/java/io/quarkus/devservices/keycloak/KeycloakDevServicesConfig.java
@@ -7,6 +7,7 @@
import java.util.OptionalInt;
import java.util.Set;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.quarkus.runtime.annotations.ConfigRoot;
import io.quarkus.runtime.configuration.MemorySize;
@@ -40,6 +41,7 @@ public interface KeycloakDevServicesConfig {
* ends with `-legacy`.
* Override with `quarkus.keycloak.devservices.keycloak-x-image`.
*/
+ @ConfigDocDefault(value = "`{keycloak-image}`", escape = false)
Optional imageName();
/**
diff --git a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java
index c67319b1bc6f5..1fb226fdf62f8 100644
--- a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java
+++ b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java
@@ -58,8 +58,8 @@ interface ElasticsearchDevServicesBuildTimeConfig {
*
* Defaults depend on the configured `distribution`:
*
- * * For the `elastic` distribution: {elasticsearch-image}
- * * For the `opensearch` distribution: {opensearch-image}
+ * * For the `elastic` distribution: `{elasticsearch-image}`
+ * * For the `opensearch` distribution: `{opensearch-image}`
*
* @asciidoclet
*/
diff --git a/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/devservices/InfinispanDevServiceProcessor.java b/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/devservices/InfinispanDevServiceProcessor.java
index 3327c7b5ee94a..8a69e01c0cdc6 100644
--- a/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/devservices/InfinispanDevServiceProcessor.java
+++ b/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/devservices/InfinispanDevServiceProcessor.java
@@ -1,9 +1,9 @@
package io.quarkus.infinispan.client.deployment.devservices;
+import static io.quarkus.devservices.common.ConfigureUtil.getDefaultImageNameFor;
import static io.quarkus.devservices.common.ContainerLocator.locateContainerWithLabels;
import static io.quarkus.runtime.LaunchMode.DEVELOPMENT;
import static org.infinispan.server.test.core.InfinispanContainer.DEFAULT_USERNAME;
-import static org.infinispan.server.test.core.InfinispanContainer.IMAGE_BASENAME;
import java.io.Closeable;
import java.time.Duration;
@@ -17,7 +17,6 @@
import org.infinispan.client.hotrod.configuration.ClientIntelligence;
import org.infinispan.client.hotrod.impl.ConfigurationProperties;
-import org.infinispan.commons.util.Version;
import org.infinispan.server.test.core.InfinispanContainer;
import org.jboss.logging.Logger;
import org.testcontainers.containers.BindMode;
@@ -240,7 +239,8 @@ private RunningDevService startContainer(String clientName, DockerStatusBuildIte
.map(containerAddress -> getRunningDevService(clientName, containerAddress.getId(), null,
containerAddress.getUrl(), DEFAULT_USERNAME, DEFAULT_PASSWORD, properties)) // TODO can this be always right ?
.or(() -> ComposeLocator.locateContainer(composeProjectBuildItem,
- List.of(devServicesConfig.imageName().orElse(IMAGE_BASENAME), "infinispan", "datagrid"),
+ List.of(devServicesConfig.imageName().orElseGet(() -> getDefaultImageNameFor("infinispan")),
+ "infinispan", "datagrid"),
DEFAULT_INFINISPAN_PORT, launchMode, useSharedNetwork)
.map(address -> getRunningDevService(clientName, address, properties)))
.orElseGet(infinispanServerSupplier);
@@ -290,7 +290,7 @@ private static class QuarkusInfinispanContainer extends InfinispanContainer {
public QuarkusInfinispanContainer(String clientName, InfinispanDevServicesConfig config,
LaunchMode launchMode, String defaultNetworkId, boolean useSharedNetwork) {
- super(config.imageName().orElse(IMAGE_BASENAME + ":" + Version.getUnbrandedVersion()));
+ super(config.imageName().orElseGet(() -> getDefaultImageNameFor("infinispan")));
this.fixedExposedPort = config.port();
this.useSharedNetwork = useSharedNetwork;
if (launchMode == DEVELOPMENT) {
diff --git a/extensions/infinispan-client/deployment/src/main/resources/infinispan-devservice.properties b/extensions/infinispan-client/deployment/src/main/resources/infinispan-devservice.properties
new file mode 100644
index 0000000000000..6f29492d8c251
--- /dev/null
+++ b/extensions/infinispan-client/deployment/src/main/resources/infinispan-devservice.properties
@@ -0,0 +1 @@
+default.image=${infinispan.image}
diff --git a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanDevServicesConfig.java b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanDevServicesConfig.java
index c541232951532..8dd858d3df8d6 100644
--- a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanDevServicesConfig.java
+++ b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanDevServicesConfig.java
@@ -5,6 +5,7 @@
import java.util.Optional;
import java.util.OptionalInt;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.quarkus.runtime.annotations.ConfigGroup;
import io.smallrye.config.WithDefault;
@@ -70,6 +71,7 @@ public interface InfinispanDevServicesConfig {
* The image to use.
* Note that only official Infinispan images are supported.
*/
+ @ConfigDocDefault(value = "`{infinispan-image}`", escape = false)
Optional imageName();
/**
diff --git a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/DevServicesBuildTimeConfig.java b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/DevServicesBuildTimeConfig.java
index d693fca198cfd..af8ad36bfcb57 100644
--- a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/DevServicesBuildTimeConfig.java
+++ b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/DevServicesBuildTimeConfig.java
@@ -3,6 +3,7 @@
import java.util.Map;
import java.util.Optional;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.quarkus.runtime.annotations.ConfigGroup;
import io.smallrye.config.WithDefault;
@@ -22,6 +23,7 @@ public interface DevServicesBuildTimeConfig {
/**
* The container image name to use, for container based DevServices providers.
*/
+ @ConfigDocDefault(value = "`{mongo-image}`", escape = false)
Optional imageName();
/**
diff --git a/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/DevServicesLRAProcessor.java b/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/DevServicesLRAProcessor.java
index 1fa6fda48a377..72d6effdd8fa5 100644
--- a/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/DevServicesLRAProcessor.java
+++ b/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/DevServicesLRAProcessor.java
@@ -1,5 +1,6 @@
package io.quarkus.narayana.lra.deployment.devservice;
+import static io.quarkus.devservices.common.ConfigureUtil.getDefaultImageNameFor;
import static io.quarkus.devservices.common.ContainerLocator.locateContainerWithLabels;
import java.util.List;
@@ -63,7 +64,7 @@ public DevServicesResultBuildItem lraCoordinatorDevService(
return lraCoordinatorContainerLocator
.locateContainer(config.serviceName(), config.shared(), launchMode.getLaunchMode())
.or(() -> ComposeLocator.locateContainer(compose,
- List.of(config.imageName(), "lra-coordinator"),
+ List.of(config.imageName().orElseGet(() -> getDefaultImageNameFor("narayana-lra")), "lra-coordinator"),
LRA_COORDINATOR_CONTAINER_PORT, launchMode.getLaunchMode(), useSharedNetwork))
.map(containerAddress -> DevServicesResultBuildItem.discovered()
.feature(Feature.NARAYANA_LRA)
@@ -97,7 +98,8 @@ private void logDevServiceStarted(String connectionInfo) {
private Startable createContainer(DevServicesComposeProjectBuildItem compose,
LRACoordinatorDevServicesBuildTimeConfig config, boolean useSharedNetwork, LaunchModeBuildItem launchMode) {
- return new LRACoordinatorContainer(DockerImageName.parse(config.imageName()),
+ return new LRACoordinatorContainer(
+ DockerImageName.parse(config.imageName().orElseGet(() -> getDefaultImageNameFor("narayana-lra"))),
config.port().orElse(0),
compose.getDefaultNetworkId(),
useSharedNetwork)
diff --git a/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/LRACoordinatorDevServicesBuildTimeConfig.java b/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/LRACoordinatorDevServicesBuildTimeConfig.java
index 31d08ffd5831c..09f65cea3172c 100644
--- a/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/LRACoordinatorDevServicesBuildTimeConfig.java
+++ b/extensions/narayana-lra/deployment/src/main/java/io/quarkus/narayana/lra/deployment/devservice/LRACoordinatorDevServicesBuildTimeConfig.java
@@ -1,8 +1,10 @@
package io.quarkus.narayana.lra.deployment.devservice;
import java.util.Map;
+import java.util.Optional;
import java.util.OptionalInt;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.smallrye.config.WithDefault;
@@ -26,8 +28,8 @@ public interface LRACoordinatorDevServicesBuildTimeConfig {
/**
* Optional override of the LRA coordinator container image to use.
*/
- @WithDefault("quay.io/jbosstm/lra-coordinator:7.2.2.Final-3.25.0")
- String imageName();
+ @ConfigDocDefault(value = "`{narayana-lra-image}`", escape = false)
+ Optional imageName();
/**
* Indicates if the LRA coordinator managed by Quarkus Dev Services is shared.
diff --git a/extensions/narayana-lra/deployment/src/main/resources/narayana-lra-devservice.properties b/extensions/narayana-lra/deployment/src/main/resources/narayana-lra-devservice.properties
new file mode 100644
index 0000000000000..b01cf71c0d735
--- /dev/null
+++ b/extensions/narayana-lra/deployment/src/main/resources/narayana-lra-devservice.properties
@@ -0,0 +1 @@
+default.image=${narayana-lra.image}
diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesConfig.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesConfig.java
index 48623c9b696e0..a2446bf8cd7cf 100644
--- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesConfig.java
+++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesConfig.java
@@ -4,6 +4,7 @@
import java.util.Optional;
import java.util.OptionalInt;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.quarkus.runtime.annotations.ConfigGroup;
import io.smallrye.config.WithDefault;
@@ -26,6 +27,7 @@ public interface DevServicesConfig {
* If you want to use Redis Stack modules (bloom, graph, search...), use:
* {@code redis/redis-stack:latest}.
*/
+ @ConfigDocDefault(value = "`{redis-image}`", escape = false)
Optional imageName();
/**
diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesRedisProcessor.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesRedisProcessor.java
index dd12904190ab2..7d8836b3ec3d2 100644
--- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesRedisProcessor.java
+++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesRedisProcessor.java
@@ -1,6 +1,7 @@
package io.quarkus.redis.deployment.client;
import static io.quarkus.devservices.common.ConfigureUtil.configureSharedServiceLabel;
+import static io.quarkus.devservices.common.ConfigureUtil.getDefaultImageNameFor;
import static io.quarkus.devservices.common.ContainerLocator.locateContainerWithLabels;
import static io.quarkus.redis.runtime.client.config.RedisConfig.HOSTS;
import static io.quarkus.redis.runtime.client.config.RedisConfig.getPropertyName;
@@ -38,7 +39,6 @@
public class DevServicesRedisProcessor {
private static final Logger log = Logger.getLogger(DevServicesRedisProcessor.class);
- private static final String REDIS_IMAGE = "docker.io/redis:7";
private static final int REDIS_EXPOSED_PORT = 6379;
private static final String REDIS_SCHEME = "redis://";
@@ -84,8 +84,10 @@ public void startRedisContainers(LaunchModeBuildItem launchMode,
.serviceName(name)
.serviceConfig(redisConfig)
.startable(() -> new QuarkusPortRedisContainer(
- DockerImageName.parse(redisConfig.imageName().orElse(REDIS_IMAGE))
- .asCompatibleSubstituteFor(REDIS_IMAGE),
+ DockerImageName
+ .parse(redisConfig.imageName()
+ .orElseGet(() -> getDefaultImageNameFor("redis")))
+ .asCompatibleSubstituteFor("redis"),
redisConfig.port(),
composeProjectBuildItem.getDefaultNetworkId(),
useSharedNetwork)
@@ -128,7 +130,7 @@ private DevServicesResultBuildItem discoverRunningService(DevServicesComposeProj
boolean useSharedNetwork) {
return redisContainerLocator.locateContainer(devServicesConfig.serviceName(), devServicesConfig.shared(), launchMode)
.or(() -> ComposeLocator.locateContainer(composeProjectBuildItem,
- List.of(devServicesConfig.imageName().orElse("redis")),
+ List.of(devServicesConfig.imageName().orElseGet(() -> getDefaultImageNameFor("redis"))),
REDIS_EXPOSED_PORT, launchMode, useSharedNetwork))
.map(containerAddress -> {
String redisUrl = REDIS_SCHEME + containerAddress.getUrl();
diff --git a/extensions/redis-client/deployment/src/main/resources/redis-devservice.properties b/extensions/redis-client/deployment/src/main/resources/redis-devservice.properties
new file mode 100644
index 0000000000000..c9c6f87bc1c51
--- /dev/null
+++ b/extensions/redis-client/deployment/src/main/resources/redis-devservice.properties
@@ -0,0 +1 @@
+default.image=${redis.image}
diff --git a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java
index 95f8f70bfc549..98507fde7821a 100644
--- a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java
+++ b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java
@@ -4,11 +4,7 @@
import java.util.Optional;
import java.util.OptionalInt;
-import io.quarkus.runtime.annotations.ConfigDocMapKey;
-import io.quarkus.runtime.annotations.ConfigDocSection;
-import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigPhase;
-import io.quarkus.runtime.annotations.ConfigRoot;
+import io.quarkus.runtime.annotations.*;
import io.smallrye.config.ConfigMapping;
import io.smallrye.config.WithDefault;
@@ -47,8 +43,8 @@ interface ApicurioRegistryDevServicesBuildTimeConfig {
* Note that only Apicurio Registry 2.x images are supported.
* Specifically, the image repository must end with {@code apicurio/apicurio-registry-mem}.
*/
- @WithDefault("quay.io/apicurio/apicurio-registry-mem:2.4.2.Final")
- String imageName();
+ @ConfigDocDefault(value = "`{apicurio-registry-image}`", escape = false)
+ Optional imageName();
/**
* Indicates if the Apicurio Registry instance managed by Quarkus Dev Services is shared.
diff --git a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java
index a30802460dcd4..2b83d2a270ea5 100644
--- a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java
+++ b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java
@@ -1,5 +1,6 @@
package io.quarkus.apicurio.registry.devservice;
+import static io.quarkus.devservices.common.ConfigureUtil.getDefaultImageNameFor;
import static io.quarkus.devservices.common.ContainerLocator.locateContainerWithLabels;
import static io.quarkus.devservices.common.Labels.QUARKUS_DEV_SERVICE;
@@ -234,7 +235,7 @@ private static final class ApicurioRegistryDevServiceCfg {
public ApicurioRegistryDevServiceCfg(ApicurioRegistryDevServicesBuildTimeConfig config) {
this.devServicesEnabled = config.enabled().orElse(true);
- this.imageName = config.imageName();
+ this.imageName = config.imageName().orElseGet(() -> getDefaultImageNameFor("apicurio-registry"));
this.fixedExposedPort = config.port().orElse(0);
this.shared = config.shared();
this.serviceName = config.serviceName();
diff --git a/extensions/schema-registry/devservice/deployment/src/main/resources/apicurio-registry-devservice.properties b/extensions/schema-registry/devservice/deployment/src/main/resources/apicurio-registry-devservice.properties
new file mode 100644
index 0000000000000..a49ff60d67f3c
--- /dev/null
+++ b/extensions/schema-registry/devservice/deployment/src/main/resources/apicurio-registry-devservice.properties
@@ -0,0 +1 @@
+default.image=${apicurio-registry.image}
diff --git a/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesBuildTimeConfig.java b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesBuildTimeConfig.java
index 0b89620630f8f..aaad61ab118bf 100644
--- a/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesBuildTimeConfig.java
+++ b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesBuildTimeConfig.java
@@ -3,6 +3,7 @@
import java.util.Map;
import java.util.Optional;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.quarkus.runtime.annotations.ConfigGroup;
import io.smallrye.config.WithDefault;
@@ -34,8 +35,8 @@ public interface AmqpDevServicesBuildTimeConfig {
* page
* to find the available versions.
*/
- @WithDefault("quay.io/artemiscloud/activemq-artemis-broker:1.0.25")
- String imageName();
+ @ConfigDocDefault(value = "`{amqp-image}`", escape = false)
+ Optional imageName();
/**
* The value of the {@code AMQ_EXTRA_ARGS} environment variable to pass to the container.
diff --git a/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesProcessor.java b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesProcessor.java
index db712fffaa844..a7d7ce9d31ecf 100644
--- a/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesProcessor.java
+++ b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpDevServicesProcessor.java
@@ -1,5 +1,6 @@
package io.quarkus.smallrye.reactivemessaging.amqp.deployment;
+import static io.quarkus.devservices.common.ConfigureUtil.getDefaultImageNameFor;
import static io.quarkus.devservices.common.ContainerLocator.locateContainerWithLabels;
import static io.quarkus.devservices.common.Labels.QUARKUS_DEV_SERVICE;
@@ -291,7 +292,7 @@ private static final class AmqpDevServiceCfg {
public AmqpDevServiceCfg(AmqpDevServicesBuildTimeConfig devServicesConfig) {
this.devServicesEnabled = devServicesConfig.enabled().orElse(true);
- this.imageName = devServicesConfig.imageName();
+ this.imageName = devServicesConfig.imageName().orElseGet(() -> getDefaultImageNameFor("amqp"));
this.fixedExposedPort = devServicesConfig.port().orElse(0);
this.extra = devServicesConfig.extraArgs();
this.shared = devServicesConfig.shared();
diff --git a/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/resources/amqp-devservice.properties b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/resources/amqp-devservice.properties
new file mode 100644
index 0000000000000..1181fecb24128
--- /dev/null
+++ b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/resources/amqp-devservice.properties
@@ -0,0 +1 @@
+default.image=${amqp.image}
diff --git a/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesBuildTimeConfig.java b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesBuildTimeConfig.java
index 15ed31511e0b5..adb8340a884e7 100644
--- a/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesBuildTimeConfig.java
+++ b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesBuildTimeConfig.java
@@ -3,6 +3,7 @@
import java.util.Map;
import java.util.Optional;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.quarkus.runtime.annotations.ConfigGroup;
import io.smallrye.config.WithDefault;
@@ -33,8 +34,8 @@ public interface PulsarDevServicesBuildTimeConfig {
* Check https://hub.docker.com/r/apachepulsar/pulsar to find the available versions.
*/
// Alpine-based images starting from 3.3.0 fail to start on aarch64: https://github.com/apache/pulsar/issues/23306
- @WithDefault("apachepulsar/pulsar:3.2.4")
- String imageName();
+ @ConfigDocDefault(value = "`{pulsar-image}`", escape = false)
+ Optional imageName();
/**
* Indicates if the Pulsar broker managed by Quarkus Dev Services is shared.
diff --git a/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesProcessor.java b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesProcessor.java
index 391a94127e8bc..242dc8c392fed 100644
--- a/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesProcessor.java
+++ b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarDevServicesProcessor.java
@@ -1,5 +1,6 @@
package io.quarkus.smallrye.reactivemessaging.pulsar.deployment;
+import static io.quarkus.devservices.common.ConfigureUtil.getDefaultImageNameFor;
import static io.quarkus.devservices.common.ContainerLocator.locateContainerWithLabels;
import static io.quarkus.devservices.common.Labels.QUARKUS_DEV_SERVICE;
@@ -276,7 +277,7 @@ private static final class PulsarDevServiceCfg {
public PulsarDevServiceCfg(PulsarDevServicesBuildTimeConfig devServicesConfig) {
this.devServicesEnabled = devServicesConfig.enabled().orElse(true);
- this.imageName = devServicesConfig.imageName();
+ this.imageName = devServicesConfig.imageName().orElseGet(() -> getDefaultImageNameFor("pulsar"));
this.fixedExposedPort = devServicesConfig.port().orElse(0);
this.shared = devServicesConfig.shared();
this.serviceName = devServicesConfig.serviceName();
diff --git a/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/resources/pulsar-devservice.properties b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/resources/pulsar-devservice.properties
new file mode 100644
index 0000000000000..0ee60f37b405a
--- /dev/null
+++ b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/resources/pulsar-devservice.properties
@@ -0,0 +1 @@
+default.image=${pulsar.image}
diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesBuildTimeConfig.java b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesBuildTimeConfig.java
index 015569e7fa21f..8987d12a70b8b 100644
--- a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesBuildTimeConfig.java
+++ b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesBuildTimeConfig.java
@@ -5,6 +5,7 @@
import java.util.Optional;
import java.util.OptionalInt;
+import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigDocMapKey;
import io.quarkus.runtime.annotations.ConfigGroup;
import io.smallrye.config.WithDefault;
@@ -140,8 +141,8 @@ public interface Binding {
* Note that only official RabbitMQ images are supported.
* Specifically, the image repository must end with {@code rabbitmq}.
*/
- @WithDefault("rabbitmq:3.12-management")
- String imageName();
+ @ConfigDocDefault(value = "`{rabbitmq-image}`", escape = false)
+ Optional imageName();
/**
* Indicates if the RabbitMQ broker managed by Quarkus Dev Services is shared.
diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesProcessor.java b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesProcessor.java
index b32e56ef0a11a..41fad2491a6f4 100644
--- a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesProcessor.java
+++ b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesProcessor.java
@@ -1,5 +1,6 @@
package io.quarkus.smallrye.reactivemessaging.rabbitmq.deployment;
+import static io.quarkus.devservices.common.ConfigureUtil.getDefaultImageNameFor;
import static io.quarkus.devservices.common.ContainerLocator.locateContainerWithLabels;
import static io.quarkus.devservices.common.Labels.QUARKUS_DEV_SERVICE;
@@ -371,7 +372,7 @@ static class Binding {
public RabbitMQDevServiceCfg(RabbitMQDevServicesBuildTimeConfig devServicesConfig) {
this.devServicesEnabled = devServicesConfig.enabled().orElse(true);
- this.imageName = devServicesConfig.imageName();
+ this.imageName = devServicesConfig.imageName().orElseGet(() -> getDefaultImageNameFor("rabbitmq"));
this.fixedExposedPort = devServicesConfig.port().orElse(0);
this.fixedExposedHttpPort = devServicesConfig.httpPort().orElse(0);
this.shared = devServicesConfig.shared();
diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/resources/rabbitmq-devservice.properties b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/resources/rabbitmq-devservice.properties
new file mode 100644
index 0000000000000..662e5ea7fe640
--- /dev/null
+++ b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/resources/rabbitmq-devservice.properties
@@ -0,0 +1 @@
+default.image=${rabbitmq.image}
diff --git a/integration-tests/kafka-avro-apicurio2/src/main/resources/application.properties b/integration-tests/kafka-avro-apicurio2/src/main/resources/application.properties
index da7eb6b7cfb26..b17213e7550f0 100644
--- a/integration-tests/kafka-avro-apicurio2/src/main/resources/application.properties
+++ b/integration-tests/kafka-avro-apicurio2/src/main/resources/application.properties
@@ -5,4 +5,4 @@ quarkus.log.category.\"org.apache.zookeeper\".level=WARN
# enable health check
quarkus.kafka.health.enabled=true
-quarkus.apicurio-registry.devservices.image-name=quay.io/apicurio/apicurio-registry-mem:2.4.2.Final
+quarkus.apicurio-registry.devservices.image-name=${apicurio-registry.image}
diff --git a/integration-tests/kafka-json-schema-apicurio2/src/main/resources/application.properties b/integration-tests/kafka-json-schema-apicurio2/src/main/resources/application.properties
index 69d4364f6b1c5..e1de76ce2307d 100644
--- a/integration-tests/kafka-json-schema-apicurio2/src/main/resources/application.properties
+++ b/integration-tests/kafka-json-schema-apicurio2/src/main/resources/application.properties
@@ -7,4 +7,4 @@ quarkus.native.resources.includes=json-schema.json
# enable health check
quarkus.kafka.health.enabled=true
-quarkus.apicurio-registry.devservices.image-name=quay.io/apicurio/apicurio-registry-mem:2.4.2.Final
+quarkus.apicurio-registry.devservices.image-name=${apicurio-registry.image}
diff --git a/integration-tests/opentelemetry-jdbc-instrumentation/README.md b/integration-tests/opentelemetry-jdbc-instrumentation/README.md
index d6f4da87fe7f7..af4aca9ba217e 100644
--- a/integration-tests/opentelemetry-jdbc-instrumentation/README.md
+++ b/integration-tests/opentelemetry-jdbc-instrumentation/README.md
@@ -25,7 +25,7 @@ You can also run tests with a specific database image, just set the following pa
For example to run tests with the latest PostgreSQL database image, you can run the following command:
```
-mvn verify -Dtest-containers -Dstart-containers -Dpostgres.image=docker.io/postgres:latest
+mvn verify -Dtest-containers -Dstart-containers -Dpostgres.image=docker.io/library/postgres:latest
```
Unfortunately booting DB2 is slow and needs to set a generous timeout, therefore the DB2 test is disabled by default.
diff --git a/integration-tests/virtual-threads/jms-virtual-threads/src/main/resources/application.properties b/integration-tests/virtual-threads/jms-virtual-threads/src/main/resources/application.properties
index fd8aab5e2348f..e4cacbb735b8d 100644
--- a/integration-tests/virtual-threads/jms-virtual-threads/src/main/resources/application.properties
+++ b/integration-tests/virtual-threads/jms-virtual-threads/src/main/resources/application.properties
@@ -5,4 +5,4 @@ mp.messaging.outgoing.prices-out.destination=prices
smallrye.messaging.worker..max-concurrency=5
quarkus.artemis.devservices.enabled=true
-quarkus.artemis.devservices.image-name=quay.io/artemiscloud/activemq-artemis-broker:1.0.25
+quarkus.artemis.devservices.image-name=${amqp.image}