{"record":{"id":"f4739dd9de0e39d7","repo":"jdx/mise","slug":"legacy-docker-compose-v1-is-unsupported-install","errorCode":null,"errorMessage":"legacy 'docker-compose' v1 is unsupported; install Docker Compose v2 or set command to a compatible frontend","messagePattern":"legacy 'docker-compose' v1 is unsupported; install Docker Compose v2 or set command to a compatible frontend","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"src/system/compose.rs","lineNumber":847,"sourceCode":"            return resolve_command(&self.command);\n        }\n        self.detected_compose_command()?\n            .ok_or_else(|| eyre!(\"neither 'docker compose' nor 'docker-compose' was found\"))\n    }\n\n    fn detected_compose_command(&self) -> Result<Option<Vec<String>>> {\n        if let Some(docker) = crate::file::which(\"docker\") {\n            let docker = docker.to_string_lossy().to_string();\n            if compose_plugin_available(&docker) {\n                return Ok(Some(vec![docker, \"compose\".to_string()]));\n            }\n        }\n        if let Some(compose) = crate::file::which(\"docker-compose\") {\n            let compose = compose.to_string_lossy().to_string();\n            if standalone_compose_v2_available(&compose) {\n                return Ok(Some(vec![compose]));\n            }\n            bail!(\n                \"legacy 'docker-compose' v1 is unsupported; install Docker Compose v2 or set command to a compatible frontend\"\n            );\n        }\n        Ok(None)\n    }\n\n    fn resolved_engine_command(&self) -> Result<Vec<String>> {\n        if !self.engine_command.is_empty() {\n            return resolve_command(&self.engine_command);\n        }\n        if let Some(command) = engine_command_from_compose_command(&self.command) {\n            return resolve_command(command);\n        }\n        if let Some(docker) = crate::file::which(\"docker\") {\n            return Ok(vec![docker.to_string_lossy().to_string()]);\n        }\n        bail!(\"container engine command 'docker' was not found; set engine_command explicitly\")\n    }","sourceCodeStart":829,"sourceCodeEnd":865,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/src/system/compose.rs#L829-L865","documentation":"When no `command`/`engine_command` is configured, mise autodetects a compose frontend: a `docker` CLI with the compose plugin wins; otherwise a `docker-compose` binary is probed, and if it does not report Compose v2, mise bails. The legacy Python docker-compose v1 lacks the v2 CLI surface mise relies on (e.g. `--wait`, `config --hash=*`), so it is rejected outright rather than partially supported.","triggerScenarios":"Host has no docker CLI (or a docker CLI without the compose plugin) and a `docker-compose` binary on PATH that is v1 (or otherwise fails the v2 probe `standalone_compose_v2_available`). Autodetection in `detected_compose_command` bails before any converge.","commonSituations":"Old hosts where `docker-compose` was installed via pip or the old distro package; minimal containers with the standalone v1 binary; PATH ordering that surfaces an ancient `docker-compose` before a v2 install.","solutions":["Install Docker Compose v2, ideally the docker CLI plugin (`apt install docker-compose-plugin` or equivalent), then re-run.","Or point mise at a v2-compatible frontend explicitly in the project table: `command = [\"docker\", \"compose\"]` (or a standalone v2 path).","Verify with `docker compose version` (want 'v2') and remove the legacy `docker-compose` from PATH to avoid ambiguity."],"exampleFix":"# before (autodetect finds legacy docker-compose v1)\n[bootstrap.compose.web]\nproject_dir = \"/srv/web\"\n\n# after\n[bootstrap.compose.web]\nproject_dir = \"/srv/web\"\ncommand = [\"docker\", \"compose\"]","handlingStrategy":"fallback","validationCode":"#!/usr/bin/env bash\n# verify a v2 frontend exists before relying on autodetect\ndocker compose version 2>/dev/null | grep -q 'version v2' \\\n  || docker-compose version 2>/dev/null | grep -q 'v2' \\\n  || echo 'no compose v2 found: install docker-compose-plugin or set command'","typeGuard":null,"tryCatchPattern":"match compose::plans(&requests) {\n    Ok(plans) => { /* proceed */ }\n    Err(err) if err.to_string().contains(\"legacy 'docker-compose' v1\") => {\n        // fallback: pin an explicit v2 frontend instead of autodetect\n        // [bootstrap.compose.web] command = [\"docker\", \"compose\"]\n        return Err(err);\n    }\n    Err(err) => return Err(err),\n}","preventionTips":["Pin `command = [\"docker\", \"compose\"]` in the project table instead of relying on autodetect.","Install the docker compose v2 plugin on hosts and remove legacy v1 binaries from PATH.","Check `docker compose version` reports v2 as part of host provisioning."],"tags":["mise","bootstrap","compose","docker","version-support","autodetect"],"backgroundTag":"unsupported-tool-version","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}