use std::path::Path;
use crate::{
oci::{
distribution::{DockerRegistry, OciRegistryPull},
rootfs,
},
MonocoreResult,
};
use tokio::fs;
use super::OCI_REPO_SUBDIR;
pub async fn pull_docker_image(oci_dir: impl AsRef<Path>, image_ref: &str) -> MonocoreResult<()> {
let oci_dir = oci_dir.as_ref();
let (repository, tag, repo_tag) = super::parse_image_ref(image_ref)?;
let repo_dir = oci_dir.join(OCI_REPO_SUBDIR).join(&repo_tag);
if repo_dir.exists() {
tracing::info!(
"Image {image_ref} already exists in {}, skipping pull",
oci_dir.display()
);
return Ok(());
}
let registry = DockerRegistry::with_oci_dir(oci_dir.into());
registry.pull_image(&repository, Some(&tag)).await
}
pub async fn merge_image_layers(
oci_dir: impl AsRef<Path>,
dest_dir: impl AsRef<Path>,
image_ref: &str,
) -> MonocoreResult<()> {
let oci_dir = oci_dir.as_ref();
let dest_dir = dest_dir.as_ref();
if dest_dir.exists() {
tracing::info!(
"Rootfs already exists at {}, skipping merge",
dest_dir.display()
);
return Ok(());
}
if let Some(parent) = dest_dir.parent() {
fs::create_dir_all(parent).await?;
}
let repo_tag = super::parse_image_ref(image_ref)?.2;
rootfs::merge(oci_dir, dest_dir, &repo_tag).await
}