jdx/mise · error · eyre::Report

container engine command 'docker' was not found; set engine_

Error message

container engine command 'docker' was not found; set engine_command explicitly

What it means

mise resolves the container engine for a [bootstrap.compose.<name>] project in three steps: an explicit engine_command array; the prefix of command before the word "compose" (e.g. ["podman", "compose"] implies podman); finally `docker` found on PATH. This error means all three failed, so mise has no engine to run compose against. The message tells you to short-circuit the lookup by setting engine_command.

Source

Thrown at src/system/compose.rs:864

            }
            bail!(
                "legacy 'docker-compose' v1 is unsupported; install Docker Compose v2 or set command to a compatible frontend"
            );
        }
        Ok(None)
    }

    fn resolved_engine_command(&self) -> Result<Vec<String>> {
        if !self.engine_command.is_empty() {
            return resolve_command(&self.engine_command);
        }
        if let Some(command) = engine_command_from_compose_command(&self.command) {
            return resolve_command(command);
        }
        if let Some(docker) = crate::file::which("docker") {
            return Ok(vec![docker.to_string_lossy().to_string()]);
        }
        bail!("container engine command 'docker' was not found; set engine_command explicitly")
    }

    fn configured_engine_command(&self) -> Vec<String> {
        if !self.engine_command.is_empty() {
            return self.engine_command.clone();
        }
        engine_command_from_compose_command(&self.command)
            .map(<[String]>::to_vec)
            .unwrap_or_else(|| vec!["docker".to_string()])
    }
}

fn compose_plugin_available(docker: &str) -> bool {
    Command::new(docker)
        .args(["compose", "version"])
        .envs(compose_env())
        .output()
        .is_ok_and(|output| output.status.success())

View on GitHub (pinned to 9dcfcaa0dc)

Solutions

  1. Add engine_command to the compose entry, e.g. engine_command = ["podman"] or ["nerdctl"]
  2. Or set command = ["podman", "compose"] — the prefix before "compose" becomes the engine
  3. Or install docker and ensure the docker binary is on the PATH that mise sees
  4. If the engine lives at a nonstandard location, use its absolute path in engine_command

Example fix

# before (mise.toml)
[bootstrap.compose.myapp]
project_dir = "."
# no engine_command, no docker on PATH -> error

# after
[bootstrap.compose.myapp]
project_dir = "."
engine_command = ["podman"]
Defensive patterns

Strategy: validation

Validate before calling

# before mise bootstrap, assert an engine exists
command -v docker >/dev/null 2>&1 || command -v podman >/dev/null 2>&1 || {
  echo 'no container engine on PATH; set engine_command in mise.toml' >&2; exit 1
}

Prevention

When it happens

Trigger: Running `mise bootstrap` (or any compose status/apply path) with a [bootstrap.compose.*] entry on a host where `which docker` fails and neither engine_command nor a `compose`-containing command is set in the entry.

Common situations: Podman-only hosts (Fedora/RHEL default) with no docker installed; Docker Desktop installed but the mise process runs with a stripped PATH (cron, CI runner, non-login shell); rootless nerdctl setups where the binary is named nerdctl.

Related errors


AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17). Data as JSON: /api/errors/c9e19d91bb070707. Report an issue: GitHub.