From 4e77a977df9f192fc21abc28c0bc830461f36fcb Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 20:39:57 +0100 Subject: [PATCH 01/15] Allow to set default value for config via AsciiDoc attributes --- .../discovery/DiscoveryConfigProperty.java | 18 +++++++++++++++--- .../config/model/ConfigProperty.java | 8 +++++++- .../config/resolver/ConfigResolver.java | 2 +- .../config/scanner/ConfigMappingListener.java | 8 ++++++-- .../runtime/annotations/ConfigDocDefault.java | 2 ++ .../doc/generator/AbstractFormatter.java | 6 +++++- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java index 636bde16d9671..04cf700b1d628 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java @@ -13,6 +13,7 @@ public class DiscoveryConfigProperty { private final SourceElementType sourceElementType; private final String defaultValue; private final String defaultValueForDoc; + private final boolean escapeDefaultValueForDoc; private final Deprecation deprecation; private final String mapKey; private final boolean unnamedMapKey; @@ -24,8 +25,8 @@ public class DiscoveryConfigProperty { public DiscoveryConfigProperty(String path, String sourceType, String sourceElementName, SourceElementType sourceElementType, - String defaultValue, - String defaultValueForDoc, Deprecation deprecation, String mapKey, boolean unnamedMapKey, + String defaultValue, String defaultValueForDoc, boolean escapeDefaultValueForDoc, + Deprecation deprecation, String mapKey, boolean unnamedMapKey, ResolvedType type, boolean converted, boolean enforceHyphenateEnumValue, boolean section, boolean sectionGenerated) { this.path = path; @@ -34,6 +35,7 @@ public DiscoveryConfigProperty(String path, String sourceType, String sourceElem this.sourceElementType = sourceElementType; this.defaultValue = defaultValue; this.defaultValueForDoc = defaultValueForDoc; + this.escapeDefaultValueForDoc = escapeDefaultValueForDoc; this.deprecation = deprecation; this.mapKey = mapKey; this.unnamedMapKey = unnamedMapKey; @@ -68,6 +70,10 @@ public String getDefaultValueForDoc() { return defaultValueForDoc; } + public boolean isEscapeDefaultValueForDoc() { + return escapeDefaultValueForDoc; + } + public Deprecation getDeprecation() { return deprecation; } @@ -150,6 +156,7 @@ public static class Builder { private final ResolvedType type; private String defaultValue; private String defaultValueForDoc; + private boolean escapeDefaultValueForDoc = true; private Deprecation deprecation; private String mapKey; private boolean unnamedMapKey = false; @@ -180,6 +187,11 @@ public Builder defaultValueForDoc(String defaultValueForDoc) { return this; } + public Builder escapeDefaultValueForDoc(boolean escapeDefaultValueForDoc) { + this.escapeDefaultValueForDoc = escapeDefaultValueForDoc; + return this; + } + public Builder deprecated(String since, String replacement, String reason) { this.deprecation = new Deprecation(since, replacement, reason); return this; @@ -220,7 +232,7 @@ public DiscoveryConfigProperty build() { } return new DiscoveryConfigProperty(name, sourceType, sourceElementName, sourceElementType, defaultValue, - defaultValueForDoc, + defaultValueForDoc, escapeDefaultValueForDoc, deprecation, mapKey, unnamedMapKey, type, converted, enforceHyphenateEnumValue, section, sectionGenerated); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java index 1b0ebcdfbd34f..2a3cb5c7e78f4 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java @@ -27,6 +27,7 @@ public final class ConfigProperty extends AbstractConfigItem { private final EnumAcceptedValues enumAcceptedValues; private final String defaultValue; + private final boolean escapeDefaultValue; private final String javadocSiteLink; @@ -35,7 +36,7 @@ public ConfigProperty(ConfigPhase phase, String sourceType, String sourceElement boolean list, boolean optional, boolean secret, String mapKey, boolean unnamedMapKey, boolean withinMap, boolean converted, @JsonProperty("enum") boolean isEnum, EnumAcceptedValues enumAcceptedValues, - String defaultValue, String javadocSiteLink, + String defaultValue, boolean escapeDefaultValue, String javadocSiteLink, Deprecation deprecation) { super(sourceType, sourceElementName, sourceElementType, path, type, deprecation); this.phase = phase; @@ -52,6 +53,7 @@ public ConfigProperty(ConfigPhase phase, String sourceType, String sourceElement this.isEnum = isEnum; this.enumAcceptedValues = enumAcceptedValues; this.defaultValue = defaultValue; + this.escapeDefaultValue = escapeDefaultValue; this.javadocSiteLink = javadocSiteLink; } @@ -121,6 +123,10 @@ public String getDefaultValue() { return defaultValue; } + public boolean isEscapeDefaultValue() { + return escapeDefaultValue; + } + public String getJavadocSiteLink() { return javadocSiteLink; } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 390e657bb538a..15918de84404d 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -213,7 +213,7 @@ private void resolveProperty(ConfigRoot configRoot, Map e discoveryConfigProperty.isUnnamedMapKey(), context.isWithinMap(), discoveryConfigProperty.isConverted(), discoveryConfigProperty.getType().isEnum(), - enumAcceptedValues, defaultValue, + enumAcceptedValues, defaultValue, discoveryConfigProperty.isEscapeDefaultValueForDoc(), JavadocUtil.getJavadocSiteLink(typeBinaryName), deprecation); context.getItemCollection().addItem(configProperty); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java index b5b96067ea0cc..0782fc393e5a1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -152,8 +152,12 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem AnnotationMirror configDocDefaultAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_DEFAULT); if (configDocDefaultAnnotation != null) { - builder.defaultValueForDoc( - configDocDefaultAnnotation.getElementValues().values().iterator().next().getValue().toString()); + String value = (String) utils.element().getAnnotationValues(configDocDefaultAnnotation).get("value"); + builder.defaultValueForDoc(value); + Boolean escape = (Boolean) utils.element().getAnnotationValues(configDocDefaultAnnotation).get("escape"); + if (escape != null) { + builder.escapeDefaultValueForDoc(escape); + } } if (resolvedType.isMap()) { diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java index ece03bd17604e..523564588cbb7 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java @@ -22,4 +22,6 @@ public @interface ConfigDocDefault { String value(); + + boolean escape() default true; } diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/generator/AbstractFormatter.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/generator/AbstractFormatter.java index a3ae0eadab1d1..a5aa1fbd5fc01 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/generator/AbstractFormatter.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/generator/AbstractFormatter.java @@ -252,7 +252,11 @@ private String formatSingleDefaultValue(ConfigProperty configProperty, String de } } - return escapeDefaultValue(defaultValue); + if (configProperty.isEscapeDefaultValue()) { + return escapeDefaultValue(defaultValue); + } else { + return defaultValue; + } } private static String trimFinalDot(String javadoc) { From 0b38e18e1c40de27d669bdd1d4ca7e760fb3e75c Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 20:42:22 +0100 Subject: [PATCH 02/15] Set default Docker image for Keycloak Dev Services --- docs/src/main/asciidoc/_attributes.adoc | 2 +- docs/src/main/asciidoc/security-keycloak-authorization.adoc | 2 +- .../security-oidc-bearer-token-authentication-tutorial.adoc | 2 +- .../security-oidc-code-flow-authentication-tutorial.adoc | 2 +- docs/src/main/asciidoc/security-openid-connect-client.adoc | 2 +- .../src/main/asciidoc/security-openid-connect-dev-services.adoc | 2 +- .../src/main/asciidoc/security-openid-connect-multitenancy.adoc | 2 +- .../quarkus/devservices/keycloak/KeycloakDevServicesConfig.java | 2 ++ 8 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index 498613d9c8dc2..24f420332ee69 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -18,7 +18,7 @@ :infinispan-protostream-version: ${infinispan.protostream.version} :logstash-image: ${logstash.image} :kibana-image: ${kibana.image} -:keycloak-docker-image: ${keycloak.docker.image} +:keycloak-image: ${keycloak.docker.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/security-keycloak-authorization.adoc b/docs/src/main/asciidoc/security-keycloak-authorization.adoc index 65ce9b2a87466..7f1d7732adfd9 100644 --- a/docs/src/main/asciidoc/security-keycloak-authorization.adoc +++ b/docs/src/main/asciidoc/security-keycloak-authorization.adoc @@ -316,7 +316,7 @@ docker run --name keycloak \ -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \ -p 8543:8443 \ -v "$(pwd)"/config/keycloak-keystore.jks:/etc/keycloak-keystore.jks \ - {keycloak-docker-image} \ + {keycloak-image} \ start --hostname-strict=false --https-key-store-file=/etc/keycloak-keystore.jks <1> ---- <1> For Keycloak keystore, use the `keycloak-keystore.jks` file located at https://github.com/quarkusio/quarkus-quickstarts/blob/main/security-keycloak-authorization-quickstart/config/keycloak-keystore.jks[quarkus-quickstarts/security-keycloak-authorization-quickstart/config]. diff --git a/docs/src/main/asciidoc/security-oidc-bearer-token-authentication-tutorial.adoc b/docs/src/main/asciidoc/security-oidc-bearer-token-authentication-tutorial.adoc index 011dac9dff9cf..08360fa077686 100644 --- a/docs/src/main/asciidoc/security-oidc-bearer-token-authentication-tutorial.adoc +++ b/docs/src/main/asciidoc/security-oidc-bearer-token-authentication-tutorial.adoc @@ -233,7 +233,7 @@ For more information, see the <> 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/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(); /** From 4742b333f2ee558bff329dd544db2365e0832005 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 20:46:32 +0100 Subject: [PATCH 03/15] Set default Docker image for AMQP Dev Services --- build-parent/pom.xml | 4 ++++ docs/src/main/asciidoc/_attributes.adoc | 1 + docs/src/main/asciidoc/amqp-dev-services.adoc | 8 ++++---- docs/src/main/asciidoc/amqp.adoc | 4 ++-- docs/src/main/asciidoc/jms.adoc | 4 ++-- .../amqp/deployment/AmqpDevServicesBuildTimeConfig.java | 5 +++-- .../amqp/deployment/AmqpDevServicesProcessor.java | 3 ++- .../src/main/resources/amqp-devservice.properties | 1 + .../src/main/resources/application.properties | 2 +- 9 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 extensions/smallrye-reactive-messaging-amqp/deployment/src/main/resources/amqp-devservice.properties diff --git a/build-parent/pom.xml b/build-parent/pom.xml index 21cc3efc74497..a78e8ba64983a 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -110,6 +110,10 @@ 2.44.0 + + + quay.io/artemiscloud/activemq-artemis-broker:1.0.25 + diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index 24f420332ee69..f26a292f0e542 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -19,6 +19,7 @@ :logstash-image: ${logstash.image} :kibana-image: ${kibana.image} :keycloak-image: ${keycloak.docker.image} +:amqp-image: ${amqp.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/amqp-dev-services.adoc b/docs/src/main/asciidoc/amqp-dev-services.adoc index 57554e7112c05..7760241df0998 100644 --- a/docs/src/main/asciidoc/amqp-dev-services.adoc +++ b/docs/src/main/asciidoc/amqp-dev-services.adoc @@ -50,9 +50,9 @@ You can set the port by configuring the `quarkus.amqp.devservices.port` property Dev Services for AMQP uses https://quay.io/repository/artemiscloud/activemq-artemis-broker[activemq-artemis-broker] images. You can configure the image and version using the `quarkus.amqp.devservices.image-name` property: -[source, properties] +[source, properties, subs=attributes+] ---- -quarkus.amqp.devservices.image-name=quay.io/artemiscloud/activemq-artemis-broker:latest +quarkus.amqp.devservices.image-name={amqp-image} ---- IMPORTANT: The configured image must be _compatible_ with the `activemq-artemis-broker` one. @@ -65,12 +65,12 @@ The ports 5672 and 8161 (web console) are exposed. Dev Services for AMQP supports xref:compose-dev-services.adoc[Compose Dev Services]. It relies on a `compose-devservices.yml`, such as: -[source,yaml] +[source,yaml,subs=attributes+] ---- name: services: artemis: - image: quay.io/artemiscloud/activemq-artemis-broker:1.0.28 + image: {amqp-image} ports: - "5672" - "8161" diff --git a/docs/src/main/asciidoc/amqp.adoc b/docs/src/main/asciidoc/amqp.adoc index b61117c1d8e44..e03d44f08cdb8 100644 --- a/docs/src/main/asciidoc/amqp.adoc +++ b/docs/src/main/asciidoc/amqp.adoc @@ -366,14 +366,14 @@ Open `http://localhost:8080/quotes.html` in your browser and request some quotes When not running in dev or test mode, you will need to start your AMQP broker. You can follow the instructions from the https://activemq.apache.org/components/artemis/documentation/latest/using-server.html[Apache ActiveMQ Artemis website] or create a `docker-compose.yaml` file with the following content: -[source, yaml] +[source, yaml ,subs=attributes+] ---- version: '2' services: artemis: - image: quay.io/artemiscloud/activemq-artemis-broker:1.0.25 + image: {amqp-image} ports: - "8161:8161" - "61616:61616" diff --git a/docs/src/main/asciidoc/jms.adoc b/docs/src/main/asciidoc/jms.adoc index ba8b26979874f..d95382ea63721 100644 --- a/docs/src/main/asciidoc/jms.adoc +++ b/docs/src/main/asciidoc/jms.adoc @@ -81,9 +81,9 @@ implementation("org.amqphub.quarkus:quarkus-qpid-jms") Then, we need an AMQP broker. In this case we will use an Apache ActiveMQ Artemis server. You can follow the instructions from the https://activemq.apache.org/components/artemis/[Apache Artemis website] or start a broker via docker using the https://artemiscloud.io/[ArtemisCloud] container image: -[source,bash] +[source,bash,subs=attributes+] ---- -docker run -it --rm -p 8161:8161 -p 61616:61616 -p 5672:5672 -e AMQ_USER=quarkus -e AMQ_PASSWORD=quarkus quay.io/artemiscloud/activemq-artemis-broker:1.0.25 +docker run -it --rm -p 8161:8161 -p 61616:61616 -p 5672:5672 -e AMQ_USER=quarkus -e AMQ_PASSWORD=quarkus {amqp-image} ---- === The price producer 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/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} From aa2168c92262ea4128ec692c15e6b4f02ca1e6bb Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 20:51:22 +0100 Subject: [PATCH 04/15] Set default Docker image for Apicurio Registry Dev Services --- build-parent/pom.xml | 1 + docs/src/main/asciidoc/_attributes.adoc | 1 + .../main/asciidoc/apicurio-registry-dev-services.adoc | 10 +++++----- docs/src/main/asciidoc/kafka-schema-registry-avro.adoc | 4 ++-- .../asciidoc/kafka-schema-registry-json-schema.adoc | 4 ++-- .../devservice/ApicurioRegistryBuildTimeConfig.java | 10 +++------- .../DevServicesApicurioRegistryProcessor.java | 3 ++- .../resources/apicurio-registry-devservice.properties | 1 + .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 extensions/schema-registry/devservice/deployment/src/main/resources/apicurio-registry-devservice.properties diff --git a/build-parent/pom.xml b/build-parent/pom.xml index a78e8ba64983a..b231f1a907fdf 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -113,6 +113,7 @@ quay.io/artemiscloud/activemq-artemis-broker:1.0.25 + quay.io/apicurio/apicurio-registry-mem:2.6.13.Final diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index f26a292f0e542..e5381d13c2136 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -20,6 +20,7 @@ :kibana-image: ${kibana.image} :keycloak-image: ${keycloak.docker.image} :amqp-image: ${amqp.image} +:apicurio-registry-image: ${apicurio-registry.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc b/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc index cc04b67ef4411..7a539a66901a4 100644 --- a/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc +++ b/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc @@ -75,9 +75,9 @@ Note that the Kafka channels in SmallRye Reactive messaging are automatically co Dev Services for Apicurio Registry uses `apicurio/apicurio-registry-mem` images. You can select any 2.x version from https://hub.docker.com/r/apicurio/apicurio-registry-mem: -[source, properties] +[source,properties,subs=attributes+] ---- -quarkus.apicurio-registry.devservices.image-name=apicurio/apicurio-registry-mem:latest-snapshot +quarkus.apicurio-registry.devservices.image-name={apicurio-registry-image} ---- [[Compose]] @@ -86,12 +86,12 @@ quarkus.apicurio-registry.devservices.image-name=apicurio/apicurio-registry-mem: The Apicurio Dev Services supports xref:compose-dev-services.adoc[Compose Dev Services]. It relies on a `compose-devservices.yml`, such as: -[source,yaml] +[source,yaml,subs=attributes+] ---- name: services: apicurio: - image: apicurio/apicurio-registry-mem:2.4.2.Final + image: {apicurio-registry-image} ports: - "8080" ----- \ No newline at end of file +---- diff --git a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc index aedae339110be..3bd1e50b4dc34 100644 --- a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc +++ b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc @@ -317,7 +317,7 @@ You can ignore the `docker-compose` instructions here, as well as the Apicurio R Create a `docker-compose.yaml` file at the root of the project with the following content: -[source,yaml] +[source,yaml,subs=attributes+] ---- services: @@ -333,7 +333,7 @@ services: LOG_DIR: "/tmp/logs" schema-registry: - image: apicurio/apicurio-registry-mem:2.6.13.Final + image: {apicurio-registry-image} ports: - 8081:8080 depends_on: diff --git a/docs/src/main/asciidoc/kafka-schema-registry-json-schema.adoc b/docs/src/main/asciidoc/kafka-schema-registry-json-schema.adoc index 3fb0a32b2276c..b37e194345c11 100644 --- a/docs/src/main/asciidoc/kafka-schema-registry-json-schema.adoc +++ b/docs/src/main/asciidoc/kafka-schema-registry-json-schema.adoc @@ -345,7 +345,7 @@ You can ignore the `docker-compose` instructions here, as well as the Apicurio R Create a `docker-compose.yaml` file at the root of the project with the following content: -[source,yaml] +[source,yaml,subs=attributes+] ---- services: @@ -361,7 +361,7 @@ services: LOG_DIR: "/tmp/logs" schema-registry: - image: apicurio/apicurio-registry-mem:2.6.13.Final + image: {apicurio-registry-image} ports: - 8081:8080 depends_on: 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/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} From db4c4e0e142e286b4d689ccaa55655fe35cd9da6 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 20:55:36 +0100 Subject: [PATCH 05/15] Set default Docker image for Narayana LRA Dev Services --- build-parent/pom.xml | 1 + docs/src/main/asciidoc/_attributes.adoc | 1 + docs/src/main/asciidoc/lra-dev-services.adoc | 6 +++--- .../lra/deployment/devservice/DevServicesLRAProcessor.java | 6 ++++-- .../LRACoordinatorDevServicesBuildTimeConfig.java | 6 ++++-- .../src/main/resources/narayana-lra-devservice.properties | 1 + 6 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 extensions/narayana-lra/deployment/src/main/resources/narayana-lra-devservice.properties diff --git a/build-parent/pom.xml b/build-parent/pom.xml index b231f1a907fdf..05ba3a2c233d7 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -114,6 +114,7 @@ quay.io/artemiscloud/activemq-artemis-broker:1.0.25 quay.io/apicurio/apicurio-registry-mem:2.6.13.Final + quay.io/jbosstm/lra-coordinator:latest diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index e5381d13c2136..66739795ba09f 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -21,6 +21,7 @@ :keycloak-image: ${keycloak.docker.image} :amqp-image: ${amqp.image} :apicurio-registry-image: ${apicurio-registry.image} +:narayana-lra-image: ${narayana-lra.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/lra-dev-services.adoc b/docs/src/main/asciidoc/lra-dev-services.adoc index 51f92546b580d..b2b6ee02acf94 100644 --- a/docs/src/main/asciidoc/lra-dev-services.adoc +++ b/docs/src/main/asciidoc/lra-dev-services.adoc @@ -77,12 +77,12 @@ images at https://quay.io/repository/jbosstm/lra-coordinator?tab=tags. The LRA Dev Services supports xref:compose-dev-services.adoc[Compose Dev Services]. It relies on a `compose-devservices.yml`, such as: -[source,yaml] +[source,yaml,subs=attributes+] ---- name: services: - mongo: - image: quay.io/jbosstm/lra-coordinator:7.2.2.Final-3.24.4 + narayana-lra: + image: {narayana-lra-image} ports: - "8080" ---- 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} From a920a40e134ba6b5fedd58c81974090fea7fb8bf Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 20:59:08 +0100 Subject: [PATCH 06/15] Set default Docker image for MongoDB Dev Services --- docs/src/main/asciidoc/_attributes.adoc | 1 + docs/src/main/asciidoc/mongodb-dev-services.adoc | 5 +++-- docs/src/main/asciidoc/mongodb.adoc | 4 ++-- .../mongodb/deployment/DevServicesBuildTimeConfig.java | 2 ++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index 66739795ba09f..6044680c57b74 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -22,6 +22,7 @@ :amqp-image: ${amqp.image} :apicurio-registry-image: ${apicurio-registry.image} :narayana-lra-image: ${narayana-lra.image} +:mongo-image: ${mongo.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/mongodb-dev-services.adoc b/docs/src/main/asciidoc/mongodb-dev-services.adoc index bfa9f64036c7a..930cffaaf8a35 100644 --- a/docs/src/main/asciidoc/mongodb-dev-services.adoc +++ b/docs/src/main/asciidoc/mongodb-dev-services.adoc @@ -4,6 +4,7 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for MongoDB +include::_attributes.adoc[] Quarkus supports a feature called Dev Services that allows you to create various datasources without any config. In the case of MongoDB this support extends to the default MongoDB connection. What that means practically, is that if you have not configured `quarkus.mongodb.connection-string` nor `quarkus.mongodb.hosts`, Quarkus will automatically start a MongoDB container when @@ -35,12 +36,12 @@ You can disable the sharing with `quarkus.mongodb.devservices.shared=false`. The MongoDB Dev Services supports xref:compose-dev-services.adoc[Compose Dev Services]. It relies on a `compose-devservices.yml`, such as: -[source,yaml] +[source,yaml,subs=attributes+] ---- name: services: mongo: - image: docker.io/mongo:7.0 + image: {mongo-image} ports: - "27017" ---- diff --git a/docs/src/main/asciidoc/mongodb.adoc b/docs/src/main/asciidoc/mongodb.adoc index 8a1de3096508f..d1bd16cc09e08 100644 --- a/docs/src/main/asciidoc/mongodb.adoc +++ b/docs/src/main/asciidoc/mongodb.adoc @@ -372,9 +372,9 @@ startup time if the Mongo Client is inactive. Alternatively, Mongo Clients may a As by default, `MongoClient` is configured to access a local MongoDB database on port 27017 (the default MongoDB port), if you have a local running database on this port, there is nothing more to do before being able to test it! If you want to use Docker to run a MongoDB database, you can use the following command to launch one: -[source,bash] +[source,bash,subs=attributes+] ---- -docker run -ti --rm -p 27017:27017 mongo:4.4 +docker run -ti --rm -p 27017:27017 {mongo-image} ---- [NOTE] 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(); /** From 31f9993d80e33399cb3e596ca2c9b4edb70d3c36 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 21:02:22 +0100 Subject: [PATCH 07/15] Set default Docker image for RabbitMQ Dev Services --- build-parent/pom.xml | 1 + docs/src/main/asciidoc/_attributes.adoc | 1 + docs/src/main/asciidoc/rabbitmq-dev-services.adoc | 4 ++-- docs/src/main/asciidoc/rabbitmq.adoc | 4 ++-- .../deployment/RabbitMQDevServicesBuildTimeConfig.java | 5 +++-- .../rabbitmq/deployment/RabbitMQDevServicesProcessor.java | 3 ++- .../src/main/resources/rabbitmq-devservice.properties | 1 + 7 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/resources/rabbitmq-devservice.properties diff --git a/build-parent/pom.xml b/build-parent/pom.xml index 05ba3a2c233d7..0270a8568a7be 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -115,6 +115,7 @@ quay.io/artemiscloud/activemq-artemis-broker:1.0.25 quay.io/apicurio/apicurio-registry-mem:2.6.13.Final quay.io/jbosstm/lra-coordinator:latest + rabbitmq:3.12-management diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index 6044680c57b74..c81a2d5d7cfd6 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -23,6 +23,7 @@ :apicurio-registry-image: ${apicurio-registry.image} :narayana-lra-image: ${narayana-lra.image} :mongo-image: ${mongo.image} +:rabbitmq-image: ${rabbitmq.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/rabbitmq-dev-services.adoc b/docs/src/main/asciidoc/rabbitmq-dev-services.adoc index 684e5f87609cf..0da7f132e6d0b 100644 --- a/docs/src/main/asciidoc/rabbitmq-dev-services.adoc +++ b/docs/src/main/asciidoc/rabbitmq-dev-services.adoc @@ -50,9 +50,9 @@ You can set the port by configuring the `quarkus.rabbitmq.devservices.port` prop Dev Services for RabbitMQ uses official images available at https://hub.docker.com/_/rabbitmq. You can configure the image and version with the `quarkus.rabbitmq.devservices.image-name` property: -[source, properties] +[source, properties, subs=attributes+] ---- -quarkus.rabbitmq.devservices.image-name=rabbitmq:latest +quarkus.rabbitmq.devservices.image-name={rabbitmq-image} ---- == Access the management UI diff --git a/docs/src/main/asciidoc/rabbitmq.adoc b/docs/src/main/asciidoc/rabbitmq.adoc index 09f6ea5cb2e9a..1762ef5a980fb 100644 --- a/docs/src/main/asciidoc/rabbitmq.adoc +++ b/docs/src/main/asciidoc/rabbitmq.adoc @@ -419,14 +419,14 @@ Open `http://localhost:8080/quotes.html` in your browser and request some quotes When not running in dev or test mode, you will need to start your RabbitMQ broker. You can follow the instructions from the https://hub.docker.com/_/rabbitmq[RabbitMQ Docker website] or create a `docker-compose.yaml` file with the following content: -[source, yaml] +[source, yaml, subs=attributes+] ---- version: '2' services: rabbit: - image: rabbitmq:3.12-management + image: {rabbitmq-image} ports: - "5672:5672" networks: 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} From 74381f6cd7c706cead26c2540d3cfed3f72322f1 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 21:04:40 +0100 Subject: [PATCH 08/15] Set default Docker image for Pulsar Dev Services --- build-parent/pom.xml | 1 + docs/src/main/asciidoc/_attributes.adoc | 1 + docs/src/main/asciidoc/pulsar-getting-started.adoc | 4 ++-- .../pulsar/deployment/PulsarDevServicesBuildTimeConfig.java | 5 +++-- .../pulsar/deployment/PulsarDevServicesProcessor.java | 3 ++- .../src/main/resources/pulsar-devservice.properties | 1 + 6 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/resources/pulsar-devservice.properties diff --git a/build-parent/pom.xml b/build-parent/pom.xml index 0270a8568a7be..d055b16a730ea 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -116,6 +116,7 @@ quay.io/apicurio/apicurio-registry-mem:2.6.13.Final quay.io/jbosstm/lra-coordinator:latest rabbitmq:3.12-management + apachepulsar/pulsar:3.2.4 diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index c81a2d5d7cfd6..966418f8aaeaf 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -24,6 +24,7 @@ :narayana-lra-image: ${narayana-lra.image} :mongo-image: ${mongo.image} :rabbitmq-image: ${rabbitmq.image} +:pulsar-image: ${pulsar.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/pulsar-getting-started.adoc b/docs/src/main/asciidoc/pulsar-getting-started.adoc index d3108b3170879..4f65b64a22bc9 100644 --- a/docs/src/main/asciidoc/pulsar-getting-started.adoc +++ b/docs/src/main/asciidoc/pulsar-getting-started.adoc @@ -398,14 +398,14 @@ Open `http://localhost:8080/quotes.html` in your browser and request some quotes When not running in dev or test mode, you will need to start your Pulsar broker. You can follow the instructions from the https://pulsar.apache.org/docs/3.0.x/getting-started-docker/[Run a standalone Pulsar cluster in Docker] or create a `docker-compose.yaml` file with the following content: -[source, yaml] +[source, yaml ,subs=attributes+] ---- version: '3.8' services: pulsar: - image: apachepulsar/pulsar:3.2.4 + image: {pulsar-image} command: [ "sh", "-c", "bin/apply-config-from-env.py conf/standalone.conf && bin/pulsar standalone -nfw -nss" 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} From e18ca9e9340dabe1b49922f923051d2ba3696e0a Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 21:16:23 +0100 Subject: [PATCH 09/15] Set default Docker image for Redis Dev Services --- build-parent/pom.xml | 1 + docs/src/main/asciidoc/_attributes.adoc | 1 + docs/src/main/asciidoc/redis.adoc | 4 ++-- .../redis/deployment/client/DevServicesConfig.java | 2 ++ .../deployment/client/DevServicesRedisProcessor.java | 10 ++++++---- .../src/main/resources/redis-devservice.properties | 1 + 6 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 extensions/redis-client/deployment/src/main/resources/redis-devservice.properties diff --git a/build-parent/pom.xml b/build-parent/pom.xml index d055b16a730ea..b782da7c0da89 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -117,6 +117,7 @@ quay.io/jbosstm/lra-coordinator:latest rabbitmq:3.12-management apachepulsar/pulsar:3.2.4 + redis:7 diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index 966418f8aaeaf..e70c467f91539 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -25,6 +25,7 @@ :mongo-image: ${mongo.image} :rabbitmq-image: ${rabbitmq.image} :pulsar-image: ${pulsar.image} +:redis-image: ${redis.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/redis.adoc b/docs/src/main/asciidoc/redis.adoc index 8320f67c3ef31..5a62abcfe5d9d 100644 --- a/docs/src/main/asciidoc/redis.adoc +++ b/docs/src/main/asciidoc/redis.adoc @@ -479,9 +479,9 @@ However, in production, you will run your own Redis (or used a Cloud offering). Let's start a Redis server on the port 6379 using: -[source, shell] +[source, shell, subs=attributes+] ---- -docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 --name redis_quarkus_test -p 6379:6379 redis:5.0.6 +docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 --name redis_quarkus_test -p 6379:6379 {redis-image} ---- Then, open the `src/main/resources/application.properties` file and add: 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} From a7d5b2ed78251d076a35668201d573d3c5b24c97 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Wed, 19 Nov 2025 21:53:58 +0100 Subject: [PATCH 10/15] Set default Docker image for Infinispan Dev Services --- build-parent/pom.xml | 1 + docs/src/main/asciidoc/_attributes.adoc | 1 + docs/src/main/asciidoc/infinispan-client.adoc | 4 ++-- docs/src/main/asciidoc/infinispan-dev-services.adoc | 4 ++-- .../devservices/InfinispanDevServiceProcessor.java | 8 ++++---- .../src/main/resources/infinispan-devservice.properties | 1 + .../client/runtime/InfinispanDevServicesConfig.java | 2 ++ 7 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 extensions/infinispan-client/deployment/src/main/resources/infinispan-devservice.properties diff --git a/build-parent/pom.xml b/build-parent/pom.xml index b782da7c0da89..ab32037446c56 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -118,6 +118,7 @@ rabbitmq:3.12-management apachepulsar/pulsar:3.2.4 redis:7 + quay.io/infinispan/server:latest diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index e70c467f91539..2b794d129f64b 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -26,6 +26,7 @@ :rabbitmq-image: ${rabbitmq.image} :pulsar-image: ${pulsar.image} :redis-image: ${redis.image} +:infinispan-image: ${infinispan.image} :jandex-version: ${jandex.version} :jandex-gradle-plugin-version: ${jandex-gradle-plugin.version} :kotlin-version: ${kotlin.version} diff --git a/docs/src/main/asciidoc/infinispan-client.adoc b/docs/src/main/asciidoc/infinispan-client.adoc index 35b6cd4e70283..74abc18729134 100644 --- a/docs/src/main/asciidoc/infinispan-client.adoc +++ b/docs/src/main/asciidoc/infinispan-client.adoc @@ -283,9 +283,9 @@ However, in production, you will run your own Infinispan (or Red Hat Data Grid). Let's start an Infinispan server on the port 11222 using: -[source, shell] +[source, shell, subs=attributes+] ---- -docker run -it -p 11222:11222 -e USER="admin" -e PASS="password" quay.io/infinispan/server:latest +docker run -it -p 11222:11222 -e USER="admin" -e PASS="password" {infinispan-image} ---- Then, open the `src/main/resources/application.properties` file and add: diff --git a/docs/src/main/asciidoc/infinispan-dev-services.adoc b/docs/src/main/asciidoc/infinispan-dev-services.adoc index feb5f744ee796..78dcf31cb120d 100644 --- a/docs/src/main/asciidoc/infinispan-dev-services.adoc +++ b/docs/src/main/asciidoc/infinispan-dev-services.adoc @@ -209,12 +209,12 @@ You can disable the sharing with `quarkus.infinispan-client.devservices.shared=f Dev Services for Infinispan supports xref:compose-dev-services.adoc[Compose Dev Services]. It relies on a `compose-devservices.yml`, such as: -[source,yaml] +[source,yaml,subs=attributes+] ---- name: test-project services: infinispan: - image: quay.io/infinispan/server:15.0.18.Final + image: {infinispan-image} ports: - '11222' environment: 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(); /** From 2d43304313d3f9f79605fc481606c36613ac1779 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Thu, 20 Nov 2025 18:03:31 +0100 Subject: [PATCH 11/15] Set default Docker image for Datasource Dev Services --- docs/src/main/asciidoc/_attributes.adoc | 5 +++++ .../main/asciidoc/databases-dev-services.adoc | 21 ++++++++++--------- .../getting-started-dev-services.adoc | 3 ++- .../asciidoc/getting-started-reactive.adoc | 4 ++-- .../asciidoc/getting-started-testing.adoc | 4 ++-- docs/src/main/asciidoc/quartz.adoc | 8 +++---- .../main/asciidoc/reactive-sql-clients.adoc | 4 ++-- .../security-getting-started-tutorial.adoc | 6 +++--- docs/src/main/asciidoc/spring-data-jpa.adoc | 4 ++-- docs/src/main/asciidoc/spring-data-rest.adoc | 4 ++-- .../runtime/DevServicesBuildTimeConfig.java | 11 ++++++++++ 11 files changed, 46 insertions(+), 28 deletions(-) diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index 2b794d129f64b..f59247c377766 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -11,6 +11,11 @@ :mandrel-flavor: ${mandrel.image-tag-for-documentation} :surefire-version: ${version.surefire.plugin} :gradle-version: ${gradle-wrapper.version} +:db2-image: ${db2.image} +:mariadb-image: ${mariadb.image} +:mssql-image: ${mssql.image} +:oracle-image: ${oracle.image} +:postgres-image: ${postgres.image} :elasticsearch-version: ${elasticsearch-server.version} :elasticsearch-image: ${elasticsearch.image} :opensearch-image: ${opensearch.image} diff --git a/docs/src/main/asciidoc/databases-dev-services.adoc b/docs/src/main/asciidoc/databases-dev-services.adoc index f46e11c103169..92e8a4457a3a5 100644 --- a/docs/src/main/asciidoc/databases-dev-services.adoc +++ b/docs/src/main/asciidoc/databases-dev-services.adoc @@ -55,9 +55,10 @@ By default, Quarkus uses the default image for the current version of Testcontai An example file is shown below: .src/main/resources/container-license-acceptance.txt +[source,subs=attributes+] ---- -ibmcom/db2:11.5.0.0a -mcr.microsoft.com/mssql/server:2022-latest +{db2-image} +{mssql-image} ---- === Capturing Logs @@ -249,14 +250,14 @@ psql -h localhost -p -U quarkus The random port can be found with `docker ps` -[source, bash] +[source, bash, subs=attributes+] ---- docker ps # returns something like this: CONTAINER ID IMAGE [..] PORTS [..] -b826e3a168c4 postgres:14.2 [..] 0.0.0.0:49174->5432/tcp, :::49174->5432/tcp [..] <1> +b826e3a168c4 {postgres-image} [..] 0.0.0.0:49174->5432/tcp, :::49174->5432/tcp [..] <1> ---- <1> The random port is `49174`. @@ -283,10 +284,10 @@ docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Labels}}\t{{.Ports}} An example output using Dev Services for PostgreSQL is the following: -[source, bash] +[source, bash, subs=attributes+] ---- CONTAINER ID IMAGE LABELS PORTS -a7034c91a392 postgres:14 org.testcontainers.sessionId=xyz,datasource=default,org.testcontainers=true 0.0.0.0:49154->5432/tcp, :::49154->5432/tcp +a7034c91a392 {postgres-image} org.testcontainers.sessionId=xyz,datasource=default,org.testcontainers=true 0.0.0.0:49154->5432/tcp, :::49154->5432/tcp ---- In the labels tab, we see that Quarkus added the datasource label, which can be very useful in differentiating containers when multiple @@ -299,12 +300,12 @@ Dev Services have been started. The Database Dev Services supports xref:compose-dev-services.adoc[Compose Dev Services]. It relies on a `compose-devservices.yml`, such as: -[source,yaml] +[source,yaml,subs=attributes+] ---- name: services: postgresql: - image: docker.io/postgres:17 + image: {postgres-image} ports: - "5432" environment: @@ -312,7 +313,7 @@ services: POSTGRES_PASSWORD: quarkus POSTGRES_DB: quarkus oracle: - image: docker.io/gvenzl/oracle-free:23-slim-faststart + image: {oracle-image} ports: - "1521" environment: @@ -323,7 +324,7 @@ services: labels: io.quarkus.devservices.compose.wait_for.logs: .*DATABASE IS READY TO USE.* mssql: - image: mcr.microsoft.com/mssql/server:2022-latest + image: {mssql-image} ports: - "1433" environment: diff --git a/docs/src/main/asciidoc/getting-started-dev-services.adoc b/docs/src/main/asciidoc/getting-started-dev-services.adoc index 59372a18ad1c5..9419abce1b560 100644 --- a/docs/src/main/asciidoc/getting-started-dev-services.adoc +++ b/docs/src/main/asciidoc/getting-started-dev-services.adoc @@ -225,8 +225,9 @@ If you like, use your container tool to see what containers are running. For example, if you're using Docker, run `docker ps`, and for podman, run `podman ps`. You should see something like the following: +[source,bash,subs=attributes+] ---- -ff88dcedd899 docker.io/library/postgres:14 postgres -c fsync... 20 minutes ago Up 20 minutes 0.0.0.0:34789->5432/tcp nostalgic_bassi +ff88dcedd899 {postgres-image} postgres -c fsync... 20 minutes ago Up 20 minutes 0.0.0.0:34789->5432/tcp nostalgic_bassi ---- Stop Quarkus and run `docker ps` again. diff --git a/docs/src/main/asciidoc/getting-started-reactive.adoc b/docs/src/main/asciidoc/getting-started-reactive.adoc index 0d2efa4f4ad32..7001bad27ff54 100644 --- a/docs/src/main/asciidoc/getting-started-reactive.adoc +++ b/docs/src/main/asciidoc/getting-started-reactive.adoc @@ -300,12 +300,12 @@ To run the application, don’t forget to start a database and provide the confi For example, you can use Docker to run your database: -[source, bash] +[source, bash, subs=attributes+] ---- docker run -it --rm=true \ --name postgres-quarkus -e POSTGRES_USER=quarkus \ -e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=fruits \ - -p 5432:5432 postgres:14.1 + -p 5432:5432 {postgres-image} ---- Then, launch the application using: diff --git a/docs/src/main/asciidoc/getting-started-testing.adoc b/docs/src/main/asciidoc/getting-started-testing.adoc index be609b38112d5..4e4afb794353e 100644 --- a/docs/src/main/asciidoc/getting-started-testing.adoc +++ b/docs/src/main/asciidoc/getting-started-testing.adoc @@ -1392,7 +1392,7 @@ The Testcontainers library usually return connection strings without respecting The following example illustrates the use with PostgreSQL, but the approach is applicable to all containers. -[source,java] +[source,java,subs=attributes+] ---- import io.quarkus.test.common.DevServicesContext; import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; @@ -1417,7 +1417,7 @@ public class CustomResource implements QuarkusTestResourceLifecycleManager, DevS @Override public Map start() { // start a container making sure to call withNetworkMode() with the value of containerNetworkId if present - container = new PostgreSQLContainer<>("postgres:latest").withLogConsumer(outputFrame -> {}); + container = new PostgreSQLContainer<>("{postgres-image}").withLogConsumer(outputFrame -> {}); // apply the network to the container containerNetworkId.ifPresent(container::withNetworkMode); diff --git a/docs/src/main/asciidoc/quartz.adoc b/docs/src/main/asciidoc/quartz.adoc index a0d6851bee834..3182858c31b3e 100644 --- a/docs/src/main/asciidoc/quartz.adoc +++ b/docs/src/main/asciidoc/quartz.adoc @@ -319,7 +319,7 @@ http { In the root directory, create a `docker-compose.yml` file with the following content: -[source,yaml] +[source,yaml,subs=attributes+] ---- version: '3' @@ -337,7 +337,7 @@ services: - postgres nginx: <2> - image: nginx:1.17.6 + image: nginx:latest volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: @@ -347,8 +347,8 @@ services: networks: - tasks-network - postgres: <3> - image: postgres:14.1 + db: <3> + image: {postgres-image} container_name: quarkus_test environment: - POSTGRES_USER=quarkus_test diff --git a/docs/src/main/asciidoc/reactive-sql-clients.adoc b/docs/src/main/asciidoc/reactive-sql-clients.adoc index 8ccfc20be61d7..3e485582cc5bc 100644 --- a/docs/src/main/asciidoc/reactive-sql-clients.adoc +++ b/docs/src/main/asciidoc/reactive-sql-clients.adoc @@ -81,9 +81,9 @@ If you start the application in dev mode, Quarkus provides you with a https://qu You might also start a database up front: -[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} ---- ==== diff --git a/docs/src/main/asciidoc/security-getting-started-tutorial.adoc b/docs/src/main/asciidoc/security-getting-started-tutorial.adoc index 4e3f961d57883..48644eb385357 100644 --- a/docs/src/main/asciidoc/security-getting-started-tutorial.adoc +++ b/docs/src/main/asciidoc/security-getting-started-tutorial.adoc @@ -308,7 +308,7 @@ You can configure it to use plain text or custom passwords. * For custom iterations: `BcryptUtil.bcryptHash(password, iterationCount)` where higher iterations (12-14) provide more security but slower performance. ==== -- For more information about configuring passwords and roles, see xref:configure-the-application[Configure the application]. +- For more information about configuring passwords and roles, see xref:configure-the-application[Configure the application]. - For more information on hashing passwords and available options, see xref:security-jpa.adoc#password-storage-and-hashing[Password storage and hashing]. [NOTE] @@ -534,11 +534,11 @@ Then, compile and run your application in either JVM or native mode. === Start the PostgreSQL server -[source,bash] +[source,bash,subs=attributes+] ---- docker run --rm=true --name security-getting-started -e POSTGRES_USER=quarkus \ -e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=quarkus \ - -p 5432:5432 postgres:17 + -p 5432:5432 {postgres-image} ---- === Compile and run the application 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..66de984e3db07 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 @@ -28,6 +28,17 @@ 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(); From 5a70bf6830008e6f54bee590c0b1028a86adfc70 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Thu, 20 Nov 2025 18:04:10 +0100 Subject: [PATCH 12/15] Make sure to prefix for DockerHub Like we do for all other images too --- build-parent/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build-parent/pom.xml b/build-parent/pom.xml index ab32037446c56..e5961c7b8185f 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -115,9 +115,9 @@ quay.io/artemiscloud/activemq-artemis-broker:1.0.25 quay.io/apicurio/apicurio-registry-mem:2.6.13.Final quay.io/jbosstm/lra-coordinator:latest - rabbitmq:3.12-management - apachepulsar/pulsar:3.2.4 - redis:7 + docker.io/rabbitmq:3.12-management + docker.io/apachepulsar/pulsar:3.2.4 + docker.io/redis:7 quay.io/infinispan/server:latest From 29f98a47878caaee7b8175616d53969deb48e8fe Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Thu, 20 Nov 2025 18:23:45 +0100 Subject: [PATCH 13/15] Set default Docker image for Compose Dev Services --- .../main/asciidoc/compose-dev-services.adoc | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/src/main/asciidoc/compose-dev-services.adoc b/docs/src/main/asciidoc/compose-dev-services.adoc index 86548b8d1e908..310e830b595ba 100644 --- a/docs/src/main/asciidoc/compose-dev-services.adoc +++ b/docs/src/main/asciidoc/compose-dev-services.adoc @@ -56,11 +56,11 @@ Let's see how to use Compose Dev Services with examples ranging from simple to m In a Quarkus project already configured to use the `quarkus-jdbc-postgresql` extension, you can create a `compose-devservices.yml` file in the root of the project and define a custom service using Compose: -[source, yaml] +[source, yaml, subs=attributes+] ---- services: db: - image: postgres:17 + image: {postgres-image} healthcheck: test: pg_isready -U myuser -d mydb interval: 5s @@ -84,11 +84,11 @@ and the application datasource will be configured by extracting connection infor For more complex scenarios, you can define custom networks and service dependencies: -[source, yaml] +[source, yaml, subs=attributes+] ---- services: db: - image: postgres:17 + image: {postgres-image} ports: - '5432' environment: @@ -101,7 +101,7 @@ services: - postgres-data:/var/lib/postgresql/data cache: - image: redis:7 + image: {redis-image} command: redis-server --save 60 1 --loglevel warning ports: - '6379' @@ -111,7 +111,7 @@ services: - db message-broker: - image: rabbitmq:3-management + image: {rabbitmq-image} ports: - '5672' - '15672' @@ -294,11 +294,11 @@ quarkus.compose.devservices.files=src/main/docker/base-compose.yml,src/main/dock With profiles, Compose files can define a set of active profiles so that started services are adjusted for various usages and environments. You can specify the profiles to activate by setting the `quarkus.compose.devservices.profiles` property in the `application.properties` file: -[source, yaml] +[source, yaml, subs=attributes+] ---- services: db: - image: postgres:17 + image: {postgres-image} profiles: - dev - local @@ -319,11 +319,11 @@ services: You can configure Compose Dev Services to not discover specific services by adding the `io.quarkus.devservices.compose.ignore` label to the service in your Compose file: -[source, yaml] +[source, yaml, subs=attributes+] ---- services: db: - image: postgres:17 + image: {postgres-image} labels: io.quarkus.devservices.compose.ignore: true ports: @@ -345,11 +345,11 @@ Compose Dev Services provides several ways to ensure services are ready before y Compose Dev Services respects the health checks defined in your Compose file. It's recommended to configure health checks for your services to ensure they are ready before your application tries to use them: -[source, yaml] +[source, yaml, subs=attributes+] ---- services: db: - image: postgres:17 + image: {postgres-image} healthcheck: test: pg_isready -U myuser -d mydb interval: 5s @@ -419,11 +419,11 @@ This property sets the maximum time to wait for all Dev Services to start. The d Compose Dev Services starts services in the order they are defined in the Compose file. If you need to start services in a specific order, you can use the `depends_on` attribute: -[source, yaml] +[source, yaml, subs=attributes+] ---- services: db: - image: postgres:17 + image: {postgres-image} ports: - '5432' environment: @@ -444,11 +444,11 @@ services: Compose Dev Services automatically exposes the configuration of discovered services to your application. For example, when a database service is discovered with the following compose service description: -[source, yaml] +[source, yaml, subs=attributes+] ---- services: db: - image: mysql:17 + image: {mysql-image} ports: - '9906:3306' labels: From e95bc9cf3d10843179dc46af8be57dfaae47d56c Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Thu, 20 Nov 2025 19:53:12 +0100 Subject: [PATCH 14/15] Leverage backticks with `@asciidoclet` --- .../runtime/DevServicesBuildTimeConfig.java | 18 +++++++++--------- .../ElasticsearchCommonBuildTimeConfig.java | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) 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 66de984e3db07..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,17 +26,17 @@ 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} + * + * * DB2: `{db2-image}` + * * MariaDB: `{mariadb-image}` + * * Microsoft SQL Server: `{mssql-image}` + * * MySQL: `{mysql-image}` + * * Oracle Express Edition: `{oracle-image}` + * * PostgreSQL: `{postgres-image}` * * @asciidoclet */ 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 */ From b014c8a1f34f875e00d747c0fec208ea396c1a57 Mon Sep 17 00:00:00 2001 From: Willem Jan Glerum Date: Fri, 21 Nov 2025 08:55:05 +0100 Subject: [PATCH 15/15] Use fully qualified image names for docker.io --- build-parent/pom.xml | 12 ++++++------ .../opentelemetry-jdbc-instrumentation/README.md | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build-parent/pom.xml b/build-parent/pom.xml index e5961c7b8185f..894e6650e92fe 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -85,13 +85,13 @@ 2.2.0 - docker.io/postgres:17 - docker.io/mariadb:10.11 + docker.io/library/postgres:17 + docker.io/library/mariadb:10.11 icr.io/db2_community/db2:12.1.0.0 mcr.microsoft.com/mssql/server:2022-latest - docker.io/mysql:8.4 + docker.io/library/mysql:8.4 docker.io/gvenzl/oracle-free:23-slim-faststart - docker.io/mongo:7.0 + docker.io/library/mongo:7.0 4.13.2 @@ -115,9 +115,9 @@ quay.io/artemiscloud/activemq-artemis-broker:1.0.25 quay.io/apicurio/apicurio-registry-mem:2.6.13.Final quay.io/jbosstm/lra-coordinator:latest - docker.io/rabbitmq:3.12-management + docker.io/library/rabbitmq:3.12-management docker.io/apachepulsar/pulsar:3.2.4 - docker.io/redis:7 + docker.io/library/redis:7 quay.io/infinispan/server:latest 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.