{"record":{"id":"38de0e669392b60c","repo":"quarkusio/quarkus","slug":"services-have-not-been-started-yet","errorCode":null,"errorMessage":"Services have not been started yet","messagePattern":"Services have not been started yet","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/devservices/deployment/src/main/java/io/quarkus/devservices/deployment/compose/ComposeProject.java","lineNumber":224,"sourceCode":"                                    .map(c -> String.format(\"PORT_%d=%s\", e.getKey().getPort(), c.getHostPortSpec())))\n                            .collect(Collectors.joining(\"\\n\", \"\", \"\\n\"));\n                    if (!StringUtil.isNullOrEmpty(ports)) {\n                        instance.copyFileToContainer(Transferable.of(ports.getBytes(StandardCharsets.UTF_8)),\n                                exposedPortsPath);\n                    }\n                }\n            }\n        }\n    }\n\n    public void startAndWaitUntilServicesReady(Executor waitOn) {\n        start();\n        waitUntilServicesReady(waitOn);\n    }\n\n    private void checkServicesStarted() {\n        if (serviceInstances == null || serviceInstances.isEmpty()) {\n            throw new IllegalStateException(\"Services have not been started yet\");\n        }\n    }\n\n    private CompletableFuture<Void> waitOnThread(ComposeServiceWaitStrategyTarget instance, Executor waitOn) {\n        if (waitOn == null) {\n            return CompletableFuture.runAsync(() -> waitUntilReady(instance));\n        } else {\n            return CompletableFuture.runAsync(() -> waitUntilReady(instance), waitOn);\n        }\n    }\n\n    private void waitUntilReady(ComposeServiceWaitStrategyTarget instance) {\n        String serviceName = instance.getServiceName();\n        final WaitStrategy strategy = waitStrategies.get(serviceName);\n        if (strategy != null) {\n            LOG.infov(\"Waiting for service {0} to be ready\", serviceName);\n            try {\n                strategy.waitUntilReady(instance);","sourceCodeStart":206,"sourceCodeEnd":242,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devservices/deployment/src/main/java/io/quarkus/devservices/deployment/compose/ComposeProject.java#L206-L242","documentation":"ComposeProject.checkServicesStarted() throws IllegalStateException when queried before the Docker Compose project has actually created its service instances. It is a state guard: methods like waitUntilServicesReady, getEnvVarConfig, and getExposedPortConfig require start() to have completed and produced non-empty serviceInstances.","triggerScenarios":"Calling getEnvVarConfig() or getExposedPortConfig() (or waiting logic) on a ComposeProject whose start() was never invoked, failed before populating serviceInstances, or whose compose file defined zero running services.","commonSituations":"Docker daemon not running so start() produced no instances; custom DevServices code touching the ComposeProject directly before start; a compose file with services that failed to start, leaving the instance list empty.","solutions":["Ensure start() (or startCompose()) completes successfully before reading env/port config","Verify the Docker daemon is running (docker info) so compose can bring services up","Check the compose file defines the expected services and they start without error","If integrating with this class programmatically, guard with a started/ready flag or call start() idempotently before use"],"exampleFix":"// before\nvar env = composeProject.getEnvVarConfig();\n// after\ncomposeProject.start(); // or ensure started via the DevServices lifecycle\nvar env = composeProject.getEnvVarConfig();","handlingStrategy":"try-catch","validationCode":"// ensure compose services exist before reading config\nif (composeProject.getServiceInstances() == null || composeProject.getServiceInstances().isEmpty()) {\n    composeProject.start();\n}","typeGuard":"boolean isStarted(ComposeProject p) {\n    var s = p.getServiceInstances();\n    return s != null && !s.isEmpty();\n}","tryCatchPattern":"try {\n    var env = composeProject.getEnvVarConfig();\n} catch (IllegalStateException e) {\n    composeProject.start();\n    var env = composeProject.getEnvVarConfig();\n}","preventionTips":["Always drive ComposeProject through its start()/DevServices lifecycle before querying it","Verify the Docker daemon is reachable in dev/CI environments","Inspect dev-mode logs for compose startup failures that leave services unstarted"],"tags":["docker-compose","devservices","lifecycle","illegal-state"],"backgroundTag":"service-not-started","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"}