{"record":{"id":"b6b1dc2fd7078841","repo":"quarkusio/quarkus","slug":"unsupported-port-format-port","errorCode":null,"errorMessage":"Unsupported port format: ${port}","messagePattern":"Unsupported port format: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/devservices/deployment/src/main/java/io/quarkus/devservices/deployment/compose/ComposeServiceDefinition.java","lineNumber":85,"sourceCode":"                    String publishedStr = String.valueOf(published);\n                    // Port ranges \"8083-9000\"\n                    if (publishedStr.contains(\"-\")) {\n                        publishedStr = publishedStr.split(\"-\")[0];\n                    }\n                    sb.append(publishedStr).append(\":\");\n                }\n\n                // target port \"127.0.0.1:8080:80\"\n                sb.append(target);\n\n                // protocol \"127.0.0.1:8080:80/tcp\"\n                if (protocol != null) {\n                    sb.append(\"/\").append(protocol);\n                }\n\n                portString = sb.toString();\n            } else {\n                throw new IllegalArgumentException(\"Unsupported port format: \" + port);\n            }\n            return PortBinding.parse(portString);\n        })\n                .map(PortBinding::getExposedPort)\n                .collect(Collectors.toList());\n    }\n\n    public boolean hasHealthCheck() {\n        return definitionMap.get(\"healthcheck\") instanceof Map;\n    }\n\n    public Map<String, Object> getLabels() {\n        Object labels = definitionMap.get(\"labels\");\n        if (labels instanceof List) {\n            Map<String, Object> map = new HashMap<>();\n            for (Object label : ((List<?>) labels)) {\n                if (label instanceof String) {\n                    String[] split = ((String) label).split(\"=\");","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devservices/deployment/src/main/java/io/quarkus/devservices/deployment/compose/ComposeServiceDefinition.java#L67-L103","documentation":"ComposeServiceDefinition.getPorts() parses the ports section of a compose service definition into PortBinding objects. When an entry is neither the short 'HOST:CONTAINER[/PROTO]' form nor a recognized long-syntax mapping shape, it throws IllegalArgumentException('Unsupported port format: <port>').","triggerScenarios":"A docker-compose.yml ports entry uses a shape the parser does not understand — e.g. long-syntax objects with unexpected keys, malformed strings like '127.0.0.1::80' variants, host IP forms or ranges the simple parser rejects.","commonSituations":"Hand-written compose files with unusual port entries (IP-prefixed bindings, port ranges, named volumes accidentally under ports); machine-generated compose YAML using long syntax ('target: 5432, published: 5432') on a parser version that only supports short syntax.","solutions":["Rewrite the ports entry in short syntax: '5432:5432' or '127.0.0.1:5432:5432' if the parser rejects it","Remove unsupported constructs (port ranges like '5432-5434:5432-5434') and list ports individually","Check the Quarkus version — upgrade, since newer parsers accept more long-syntax variants","Bypass compose port declaration by exposing the container port and letting DevServices map it dynamically"],"exampleFix":"# before (docker-compose.yml)\n    ports:\n      - target: 5432\n        published: 15432\n# after\n    ports:\n      - \"15432:5432\"","handlingStrategy":"validation","validationCode":"// validate ports section shape before use (short syntax expected)\nfor (Object p : servicePorts) {\n    if (!(p instanceof String s) || !s.matches(\"([\\\"'])?\\\\d+:\\\\d+(/(tcp|udp))?([\\\"'])?\"))\n        throw new IllegalArgumentException(\"Use short port syntax like \\\"15432:5432\\\", got: \" + p);\n}","typeGuard":null,"tryCatchPattern":"try {\n    def.getPorts();\n} catch (IllegalArgumentException e) {\n    log.error(\"Fix docker-compose.yml ports entry: \" + e.getMessage());\n}","preventionTips":["Use short port syntax (\"host:container[/proto]\") in compose files consumed by DevServices","Avoid long-syntax port mappings unless the Quarkus version supports them","Avoid port ranges; declare each mapping separately","Test compose files with 'docker compose config' after edits"],"tags":["docker-compose","devservices","port","parse-error"],"backgroundTag":"unsupported-port-format","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"}