jdx/mise · error

{} install path does not exist: {}. Run `mise install` first

Error message

{} install path does not exist: {}. Run `mise install` first.

What it means

For every tool version in the resolved toolset that is NOT reused from the remote cache image, `mise oci build` packs the local install directory into a layer. If `tv.install_path()` is not a directory at that point, the build aborts with the tool name and missing path, telling you to install first (src/oci/builder.rs:334).

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 6f52dcdf99)

Solutions

  1. Run `mise install` in the project, then re-run `mise oci build`
  2. If a tool should come from the cache image instead, make sure the cache image actually contains that tool/version and the reuse key matches
  3. Scope the build to installed tools only, or remove the uninstalled tool from the config used for the image

Example fix

# before
mise oci build
# after
mise install && mise oci build
Defensive patterns

Strategy: validation

Validate before calling

#!/usr/bin/env bash
# Ensure every configured tool is installed before building the image
mise ls --current | awk '$2 != "missing" || NR==1' >/dev/null  # mis versions already show install state
for t in $(mise ls --current --json | jq -r '.[] | select(.installed == false) | .name + "@" + .version'); do
  echo "not installed: $t" >&2; exit 1
done
mise oci build

Prevention

When it happens

Trigger: Running `mise oci build` on a machine where some mise.toml tools are listed but not installed (fresh checkout, `mise install` never run, partial install, or install dir deleted), and those tools are not already present in the cache image being reused.

Common situations: CI runners building images on clean checkouts; a new tool added to mise.toml after the cache image was pushed; someone ran `mise prune`; MISE_DATA_DIR pointing at a wiped directory.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/62c9d328e01ef31d. Report an issue: GitHub.