use anyhow::{bail, Context, Result};
use std::path::Path;
use std::process::Command;
const DOCKER_IMAGE: &str = "debian:stable-slim";
pub fn run_in_container(staging: &Path, deb_path: &Path) -> Result<()> {
let stage_abs = staging
.canonicalize()
.with_context(|| format!("canonicalize staging dir {}", staging.display()))?;
let deb_parent_raw = deb_path
.parent()
.ok_or_else(|| anyhow::anyhow!("deb output path has no parent: {}", deb_path.display()))?;
let deb_parent = deb_parent_raw
.canonicalize()
.with_context(|| format!("canonicalize output dir {}", deb_parent_raw.display()))?;
let deb_name = deb_path
.file_name()
.ok_or_else(|| anyhow::anyhow!("deb output path has no filename"))?
.to_string_lossy()
.to_string();
let staging_mount = format!("{}:/staging:ro", stage_abs.display());
let out_mount = format!("{}:/out", deb_parent.display());
let inner = format!(
"set -e; \
apt-get update -qq >/dev/null && \
apt-get install -y -qq dpkg-dev >/dev/null && \
cp -r /staging /tmp/build && \
dpkg-deb --root-owner-group --build /tmp/build /out/{}",
deb_name
);
println!("→ dpkg-deb (docker, {})", DOCKER_IMAGE);
let status = Command::new("docker")
.args([
"run",
"--rm",
"-v",
&staging_mount,
"-v",
&out_mount,
DOCKER_IMAGE,
"bash",
"-c",
&inner,
])
.status()
.with_context(|| {
"failed to run `docker run` — is Docker installed and running? \
(On macOS: `colima start` or open Docker Desktop.)"
})?;
if !status.success() {
bail!(
"Docker-fallback dpkg-deb build failed (container exit: {})",
status
);
}
Ok(())
}