{"record":{"id":"ff350c9a62caee29","repo":"quarkusio/quarkus","slug":"only-official-rabbitmq-images-are-supported","errorCode":null,"errorMessage":"Only official rabbitmq images are supported","messagePattern":"Only official rabbitmq images are supported","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesProcessor.java","lineNumber":226,"sourceCode":"        private final int port;\n        private final int httpPort;\n        private final boolean useSharedNetwork;\n        private final String hostName;\n\n        private ConfiguredRabbitMQContainer(DockerImageName dockerImageName,\n                int fixedExposedPort, int fixedExposedHttpPort,\n                String serviceName, String defaultNetworkId, boolean useSharedNetwork) {\n            super(dockerImageName);\n            this.port = fixedExposedPort;\n            this.httpPort = fixedExposedHttpPort;\n            this.useSharedNetwork = useSharedNetwork;\n            withExposedPorts(RABBITMQ_PORT, RABBITMQ_HTTP_PORT);\n            if (serviceName != null) { // Only adds the label in dev mode.\n                withLabel(DEV_SERVICE_LABEL, serviceName);\n                withLabel(QUARKUS_DEV_SERVICE, serviceName);\n            }\n            if (!dockerImageName.getRepository().endsWith(\"rabbitmq\")) {\n                throw new IllegalArgumentException(\"Only official rabbitmq images are supported\");\n            }\n            hostName = ConfigureUtil.configureNetwork(this, defaultNetworkId, useSharedNetwork, \"rabbitmq\");\n        }\n\n        @Override\n        protected void configure() {\n            super.configure();\n            if (port > 0) {\n                addFixedExposedPort(port, RABBITMQ_PORT);\n            }\n            if (httpPort > 0) {\n                addFixedExposedPort(httpPort, RABBITMQ_HTTP_PORT);\n            }\n        }\n\n        @Override\n        public String getConnectionInfo() {\n            return String.format(\"amqp://%s:%d\", getEffectiveHost(), getPort());","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQDevServicesProcessor.java#L208-L244","documentation":"Dev Services for RabbitMQ starts a RabbitMQ container via Testcontainers. ConfiguredRabbitMQContainer's constructor rejects any configured image whose repository does not end with 'rabbitmq', because the dev-service setup (ports, commands, config injection) only works with official RabbitMQ images.","triggerScenarios":"Setting quarkus.smallrye-reactive-messaging.rabbitmq.devservices.image-name to a non-official image (fork, renamed image, or registry image whose repository doesn't end in 'rabbitmq') while Dev Services starts in dev mode/tests.","commonSituations":"Using a private-registry mirror like mycompany.com/amqp-broker, or a custom-built image named differently from rabbitmq.","solutions":["Use an official image such as rabbitmq:3.13-management","If mirroring, keep the repository path ending with rabbitmq (e.g. mirror.example.com/rabbitmq:3.13)","Disable Dev Services and configure quarkus.smallrye-reactive-messaging.rabbitmq.url to an external broker"],"exampleFix":"// before\nquarkus.smallrye-reactive-messaging.rabbitmq.devservices.image-name=mycompany/amqp:latest\n// after\nquarkus.smallrye-reactive-messaging.rabbitmq.devservices.image-name=rabbitmq:3.13-management","handlingStrategy":"validation","validationCode":"String image = ConfigProvider.getConfig().getValue(\"quarkus.smallrye-reactive-messaging.rabbitmq.devservices.image-name\", String.class);\nif (image != null && !image.split(\":\")[0].endsWith(\"rabbitmq\")) {\n    throw new IllegalStateException(\"Dev Services RabbitMQ requires an official rabbitmq image, got: \" + image);\n}","typeGuard":"static boolean isOfficialRabbitMq(String imageName) {\n    if (imageName == null) return true;\n    String repo = imageName.split(\":\")[0];\n    return repo.endsWith(\"rabbitmq\");\n}","tryCatchPattern":"try {\n    startRabbitDevService();\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"official rabbitmq\")) {\n        log.error(\"Unsupported RabbitMQ dev-service image; use an official rabbitmq image\");\n    }\n    throw e;\n}","preventionTips":["Only override the dev-services image with official rabbitmq tags","Keep registry-mirrored images named so the repository ends with rabbitmq","Use an external broker URL (quarkus.smallrye-reactive-messaging.rabbitmq.url) if a custom image is mandatory"],"tags":["devservices","testcontainers","rabbitmq","config"],"backgroundTag":"unsupported-docker-image","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}