jdx/mise · error

{tv.style} install path does not exist: {install_path.displa

Error message

{tv.style} install path does not exist: {install_path.display}. Run `mise install` first.

What it means

Before baking tools into an OCI image layer, mise verifies that each tool version's local install directory (`tv.install_path()`) actually exists. Tools are copied from the host filesystem into image layers, so if the tool was never installed on this machine the build cannot proceed; the message tells you to run `mise install` first.

Source

Thrown at src/oci/builder.rs:334

        // host-native binaries. Warning on reused-only pushes (the CI re-push
        // the reuse feature speeds up) would be a false alarm.
        let built_tool_count = tool_reuse.iter().filter(|r| r.is_none()).count();
        if built_tool_count > 0 && std::env::consts::OS != "linux" {
            warn!(
                "building on {host} host — {n} tool layer(s) contain {host} binaries that \
                 will fail with `Exec format error` inside a linux container. Run \
                 `mise oci build` on a linux host (or in a linux container) for a working image.",
                host = std::env::consts::OS,
                n = built_tool_count
            );
        }
        for (i, (_, tv)) in versions.iter().enumerate() {
            if tool_reuse[i].is_some() {
                continue; // layer comes from the cache image; no install needed
            }
            let install_path = tv.install_path();
            if !install_path.is_dir() {
                bail!(
                    "{} install path does not exist: {}. Run `mise install` first.",
                    tv.style(),
                    install_path.display()
                );
            }
        }

        // --- 3. System package layer (optional) ---
        let system_packages_layer = packages::build_system_packages_layer(
            &layout,
            &base_layers,
            &self.system_packages,
            platform
                .as_ref()
                .map(|p| p.architecture.as_str())
                .unwrap_or_else(|| crate::oci::normalize_arch(std::env::consts::ARCH)),
        )?;

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Run `mise install` to install all configured tool versions locally, then retry the build.
  2. Check `mise ls` for missing tools and install the exact version the image build expects.
  3. Verify MISE_DATA_DIR / install path settings match where your tools actually live.
  4. If the tool was supposed to come from the cache image, ensure the cache image is present/correct so the layer is reused instead of requiring a local install.

Example fix

# before: build image right after cloning
mise oci build
# error: install path does not exist
# after
mise install && mise oci build
Defensive patterns

Strategy: validation

Validate before calling

mise ls --json | jq -e '.[] | select(.installed == false) | .version' \
  && { echo 'run mise install first'; exit 1; } || true

Prevention

When it happens

Trigger: Running an OCI image build (`mise oci`/`send` flow) with tools listed in config that are pinned in mise.toml but not yet installed locally — e.g. after cloning a repo and building an image without installing tools, or after the install directory was deleted.

Common situations: Fresh checkout/CI container where `mise install` was skipped; MISE_DATA_DIR pointing somewhere else than where tools were installed; a cache-image layer-miss (`tool_reuse[i]` is None) for a tool that was assumed cached; tools installed under a different version than requested.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/b54076916f2c0c2b. Report an issue: GitHub.