use std::path::PathBuf;
use clap::ValueHint;
use eyre::Result;
use crate::cli::oci::common::{perform_build, short_digest};
use crate::config::Settings;
use crate::file::display_path;
use crate::oci::BuildOptions;
#[derive(Debug, clap::Args)]
#[clap(verbatim_doc_comment, after_long_help = AFTER_LONG_HELP)]
pub struct Build {
#[clap(long, short, default_value = "./mise-oci", value_hint = ValueHint::DirPath)]
output: PathBuf,
#[clap(long)]
from: Option<String>,
#[clap(long, short)]
tag: Option<String>,
#[clap(long)]
mount_point: Option<String>,
#[clap(long)]
no_mise: bool,
}
impl Build {
pub async fn run(self) -> Result<()> {
Settings::get().ensure_experimental("mise oci build")?;
let opts = BuildOptions {
out_dir: self.output.clone(),
from: self.from.clone(),
tag: self.tag.clone(),
mount_point: self.mount_point.clone(),
include_mise: !self.no_mise,
};
let out = perform_build(opts).await?;
miseprintln!("wrote OCI image layout to {}", display_path(&out.out_dir));
miseprintln!("manifest: {}", out.manifest_digest);
miseprintln!("tool layers:");
for l in &out.tool_layers {
miseprintln!(
" {}@{} {} {} bytes",
l.short,
l.version,
short_digest(&l.digest),
l.size
);
}
Ok(())
}
}
static AFTER_LONG_HELP: &str = color_print::cstr!(
r#"<bold><underline>Examples:</underline></bold>
Build with defaults (debian:bookworm-slim base):
$ <bold>mise oci build</bold>
Build with a specific base image and tag:
$ <bold>mise oci build --from ubuntu:24.04 --tag myorg/dev:latest -o ./img</bold>
Inspect the result with skopeo:
$ <bold>skopeo inspect oci:./mise-oci</bold>
Push to a registry:
$ <bold>skopeo copy oci:./mise-oci docker://ghcr.io/me/dev:latest</bold>
<bold><underline>Notes:</underline></bold>
- asdf and vfox plugins are not supported in v1; use a different backend
(core, aqua, ubi, github, cargo, npm, go, pipx, spm, http) for each tool.
- The host mise binary is embedded at /usr/local/bin/mise by default;
build on the same OS/arch as your target image (or pass --no-mise).
"#
);