use std::process::Command;
use tar::Archive;
use std::fs::File;
use super::cache::process_image_name;
pub fn pull_docker_image(image_name: &str) -> Result<(), String> {
let status = Command::new("docker")
.args(["pull", image_name])
.status().map_err(|e| e.to_string())?;
if status.success() {
Ok(())
} else {
Err("Failed to pull Docker image".to_string())
}
}
pub fn save_docker_image(image_name: &str, tar_path: &str) -> Result<String, String> {
pull_docker_image(image_name)?;
let tar_path = std::path::Path::new(tar_path);
let tar_file = image_name;
let tar_file = process_image_name(&tar_file.to_string());
let binding = tar_path.join(format!("{}.tar", tar_file));
let unpack_tar_path = match binding.to_str() {
Some(v) => v,
None => {
return Err("Failed to convert path to string".to_string())
}
};
let package_path = tar_path.join(tar_file);
println!("Tar path: {:?}", tar_path);
let _ = Command::new("docker")
.args(["save", "-o", unpack_tar_path, image_name])
.status().map_err(|e| e.to_string())?;
let tar_file = File::open(unpack_tar_path).map_err(|e| e.to_string())?;
let mut archive = Archive::new(tar_file);
archive.unpack(&package_path).map_err(|e| e.to_string())?;
Ok(match package_path.to_str() {
Some(v) => v.to_string(),
None => {
return Err("Failed to convert path to string".to_string())
}
})
}
pub fn build_docker_image(image: &str) -> Result<(), String> {
let platforms = "linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6,linux/s390x,linux/ppc64le";
let status = Command::new("docker")
.args(["build", "--platform", platforms, "-t", image])
.status().map_err(|e| e.to_string())?;
if status.success() {
Ok(())
} else {
Err("Failed to build Docker image".to_string())
}
}