jdx/mise · error

mise oci currently supports only apt and apk entries in…

Error message

mise oci currently supports only apt and apk entries in [bootstrap.packages]; unsupported manager(s): {}

What it means

mise's OCI bootstrap supports only apt and apk as system package managers. `[bootstrap.packages]` is a table keyed by manager name; any other key (e.g. dnf, pacman, zypper, brew) is collected, sorted/deduped, and reported in this error. It fires before any packages are installed.

Solutions

  1. Rename unsupported keys in `[bootstrap.packages]` to `apt` or `apk`
  2. Move non-system dependencies out of bootstrap.packages (use mise tools/config for those)
  3. Split the image build: bake distro packages needing another manager into a base image and reference it

Example fix

// before (mise.toml)
[bootstrap.packages]
dnf = ["curl"]
// after
[bootstrap.packages]
apt = ["curl"]
Defensive patterns

Strategy: validation

Validate before calling

# validate bootstrap.packages keys before building
tomlq -r '.bootstrap.packages | keys[]' mise.toml | grep -vE '^(apt|apk)$' \
  && echo "unsupported package manager in [bootstrap.packages]" || true

Try / catch

match build() {
    Err(e) if e.to_string().contains("supports only apt and apk") => {
        eprintln!("fix [bootstrap.packages] keys to apt/apk only");
    }
    r => r,
}

Prevention

When it happens

Trigger: Configuring `[bootstrap.packages]` in a mise.toml with keys other than `apt` or `apk`, then running an oci build — `collect_package_requests` buckets entries and bails on unknown keys.

Common situations: Typos like `apks` or `aptd`; copying package-manager names from other ecosystems (dnf, yum, pacman, brew, npm) into bootstrap.packages; migrating config from another image-builder.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/45b2f2951c689044. Report an issue: GitHub.

Appendix: source

Thrown at src/oci/packages.rs:192

    managers: &[ManagerPackages],
) -> Result<Option<(OciPackageManager, Vec<PackageRequest>)>> {
    let mut apk = vec![];
    let mut apt = vec![];
    let mut unsupported = vec![];
    for mgr in managers {
        if mgr.disabled || mgr.requests.is_empty() {
            continue;
        }
        match mgr.manager.name() {
            "apk" => apk.extend(mgr.requests.clone()),
            "apt" => apt.extend(mgr.requests.clone()),
            other => unsupported.push(other.to_string()),
        }
    }
    if !unsupported.is_empty() {
        unsupported.sort();
        unsupported.dedup();
        bail!(
            "mise oci currently supports only apt and apk entries in [bootstrap.packages]; \
             unsupported manager(s): {}",
            unsupported.join(", ")
        );
    }
    if !apk.is_empty() && !apt.is_empty() {
        bail!(
            "mise oci cannot mix apk and apt entries in [bootstrap.packages]; use the package \
             manager matching the selected base image"
        );
    }
    if !apk.is_empty() {
        Ok(Some((OciPackageManager::Apk, apk)))
    } else if !apt.is_empty() {
        Ok(Some((OciPackageManager::Apt, apt)))
    } else {
        Ok(None)
    }

View on GitHub (pinned to 533346cc37)