Back to Microsandbox

Images

docs/sdk/rust/images.mdx

0.6.711.6 KB
Original Source

Inspect, remove, prune, and import/export the local OCI image cache: the images that sandbox creation has already pulled. The ambient Image::* methods use the active default backend and return Unsupported when that backend is cloud. The *_local variants take an explicit LocalBackend and never consult ambient backend state.

rust
use microsandbox::{Image, ImagePruneReport};
<div className="msb-glance"> <p className="msb-gl"><span className="msb-dot static"></span>Ambient cache methods<span className="msb-ct">7</span></p> <a className="msb-row" href="#image-get"><span className="msb-rn">Image::get()</span><span className="msb-rg">one cached image</span></a> <a className="msb-row" href="#image-list"><span className="msb-rn">Image::list()</span><span className="msb-rg">all cached images</span></a> <a className="msb-row" href="#image-inspect"><span className="msb-rn">Image::inspect()</span><span className="msb-rg">config + layer detail</span></a> <a className="msb-row" href="#image-remove"><span className="msb-rn">Image::remove()</span><span className="msb-rg">delete a cached image</span></a> <a className="msb-row" href="#image-prune"><span className="msb-rn">Image::prune()</span><span className="msb-rg">reclaim unused data</span></a> <a className="msb-row" href="#image-load"><span className="msb-rn">Image::load()</span><span className="msb-rg">import from archive</span></a> <a className="msb-row" href="#image-save"><span className="msb-rn">Image::save()</span><span className="msb-rg">export to archive</span></a> <p className="msb-gl"><span className="msb-dot static"></span>Explicit local variants<span className="msb-ct">7</span></p> <a className="msb-row" href="#explicit-local-variants"><span className="msb-rn">Image::*_local()</span><span className="msb-rg">operate on a LocalBackend</span></a> <p className="msb-gl"><span className="msb-dot type"></span>Types</p> <div className="msb-chiprow"> <a className="msb-typepill" href="#imagehandle">ImageHandle</a> <a className="msb-typepill" href="#imagedetail">ImageDetail</a> <a className="msb-typepill" href="#imageconfigdetail">ImageConfigDetail</a> <a className="msb-typepill" href="#imagelayerdetail">ImageLayerDetail</a> <a className="msb-typepill" href="#imageprunereport">ImagePruneReport</a> <a className="msb-typepill" href="#imagearchiveformat">ImageArchiveFormat</a> </div> </div> <p className="msb-label" id="typical-flow">Typical flow</p>
rust
use microsandbox::Image;

for image in Image::list().await? {
    println!("{} ({} layers)", image.reference(), image.layer_count());
}

let detail = Image::inspect("python:3.12").await?;
println!("{:?}", detail.config.as_ref().and_then(|c| c.working_dir.as_deref()));

let report = Image::prune().await?;
println!("removed {} refs", report.image_refs_removed);

Ambient cache methods

These methods resolve the active backend with microsandbox::backend::default_backend(). They are convenient for normal local programs and fail with Unsupported when the active backend is cloud.

<span className="msb-recv">Image::</span><span className="msb-hn">get()</span>

rust
async fn get(reference: &str) -> MicrosandboxResult<ImageHandle>
<Accordion title="Example">
rust
let image = Image::get("python:3.12").await?;
println!("{:?}", image.manifest_digest());
</Accordion>

Fetch one cached image by reference. Returns ImageNotFound when the reference is not present in the local cache.

<span className="msb-recv">Image::</span><span className="msb-hn">list()</span>

rust
async fn list() -> MicrosandboxResult<Vec<ImageHandle>>
<Accordion title="Example">
rust
for image in Image::list().await? {
    println!("{}", image.reference());
}
</Accordion>

Return every cached image, ordered by creation time with newest first.

<span className="msb-recv">Image::</span><span className="msb-hn">inspect()</span>

rust
async fn inspect(reference: &str) -> MicrosandboxResult<ImageDetail>
<Accordion title="Example">
rust
let detail = Image::inspect("python:3.12").await?;
for layer in &detail.layers {
    println!("{} {}", layer.position, layer.diff_id);
}
</Accordion>

Return full detail for a cached image: handle metadata, parsed OCI config fields, and layer metadata.

<span className="msb-recv">Image::</span><span className="msb-hn">remove()</span>

rust
async fn remove(reference: &str, force: bool) -> MicrosandboxResult<()>
<Accordion title="Example">
rust
Image::remove("old:tag", false).await?;
</Accordion>

Delete a cached image. When force is false, an image still referenced by one or more sandboxes returns ImageInUse.

<span className="msb-recv">Image::</span><span className="msb-hn">prune()</span>

rust
async fn prune() -> MicrosandboxResult<ImagePruneReport>
<Accordion title="Example">
rust
let report = Image::prune().await?;
println!("{:?}", report.bytes_reclaimed);
</Accordion>

<span className="msb-recv">Image::</span><span className="msb-hn">load()</span>

<div className="msb-tags"><span className="msb-tag is-static">static</span><span className="msb-tag is-async">async</span></div>
rust
async fn load(input: &Path, tags: Vec<String>) -> MicrosandboxResult<Vec<ImageHandle>>

Import images from a local archive into the cache. Accepts docker save tarballs and OCI Image Layout archives, so locally built images can be used without going through a registry. tags applies extra references to the first image in the archive. Returns a handle for every image reference imported.

<Accordion title="Example">
rust
// docker save my-image:latest -o my-image.tar
let images = Image::load(Path::new("my-image.tar"), vec!["app:local".into()]).await?;
for image in &images {
    println!("{}", image.reference());
}
</Accordion>

<span className="msb-recv">Image::</span><span className="msb-hn">save()</span>

<div className="msb-tags"><span className="msb-tag is-static">static</span><span className="msb-tag is-async">async</span></div>
rust
async fn save(references: &[String], output: &Path, format: ImageArchiveFormat) -> MicrosandboxResult<()>

Export cached images to an archive file. ImageArchiveFormat selects the layout: Docker (loadable with docker load) or Oci (OCI Image Layout). Returns ImageNotFound when any reference is missing from the local cache.

<Accordion title="Example">
rust
use microsandbox::ImageArchiveFormat;

let references = vec!["python:3.12".to_string()];
Image::save(&references, Path::new("python.tar"), ImageArchiveFormat::Docker).await?;
</Accordion>

Explicit local variants

Use these when your program owns a specific LocalBackend and should not depend on the process default backend.

rust
use microsandbox::{Image, LocalBackend};

let backend = LocalBackend::builder()
    .home("/tmp/msb-home")
    .build()
    .await?;

let image = Image::get_local(&backend, "python:3.12").await?;
let images = Image::list_local(&backend).await?;
let detail = Image::inspect_local(&backend, image.reference()).await?;
Image::remove_local(&backend, detail.handle.reference(), false).await?;
let report = Image::prune_local(&backend).await?;
MethodSignature
get_localasync fn get_local(local: &LocalBackend, reference: &str) -> MicrosandboxResult<ImageHandle>
list_localasync fn list_local(local: &LocalBackend) -> MicrosandboxResult<Vec<ImageHandle>>
inspect_localasync fn inspect_local(local: &LocalBackend, reference: &str) -> MicrosandboxResult<ImageDetail>
remove_localasync fn remove_local(local: &LocalBackend, reference: &str, force: bool) -> MicrosandboxResult<()>
prune_localasync fn prune_local(local: &LocalBackend) -> MicrosandboxResult<ImagePruneReport>
load_localasync fn load_local(local: &LocalBackend, input: &Path, tags: Vec<String>) -> MicrosandboxResult<Vec<ImageHandle>>
save_localasync fn save_local(local: &LocalBackend, references: &[String], output: &Path, format: ImageArchiveFormat) -> MicrosandboxResult<()>

Types

ImageHandle

<p className="msb-backref">Returned by <a href="#image-get">get()</a> · <a href="#image-list">list()</a></p>

A lightweight metadata handle for a cached OCI image.

MethodReturnsDescription
reference()&strImage reference
size_bytes()Option<i64>Total image size in bytes, when known
manifest_digest()Option<&str>Content-addressable manifest digest
architecture()Option<&str>Resolved architecture
os()Option<&str>Resolved operating system
layer_count()usizeNumber of layers
last_used_at()Option<DateTime<Utc>>Last referenced time
created_at()Option<DateTime<Utc>>First-pulled time

ImageDetail

<p className="msb-backref">Returned by <a href="#image-inspect">inspect()</a></p>

Full detail for a cached image.

FieldTypeDescription
handleImageHandleCore cached image metadata
configOption<ImageConfigDetail>Parsed OCI config block
layersVec<ImageLayerDetail>Layers in bottom-to-top order

ImageConfigDetail

<p className="msb-backref">Used by <a href="#imagedetail">ImageDetail.config</a></p>

OCI image config fields extracted from the local cache.

FieldTypeDescription
digestStringConfig blob digest
envVec<String>Environment variables in KEY=value form
cmdOption<Vec<String>>Default command
entrypointOption<Vec<String>>Image entrypoint
working_dirOption<String>Default working directory
userOption<String>Default user
labelsOption<serde_json::Value>OCI labels
stop_signalOption<String>Configured stop signal

ImageLayerDetail

<p className="msb-backref">Used by <a href="#imagedetail">ImageDetail.layers</a></p>

Metadata for one image layer.

FieldTypeDescription
diff_idStringUncompressed diff ID
blob_digestStringCompressed blob digest
media_typeOption<String>OCI media type
compressed_size_bytesOption<i64>Compressed blob size in bytes
erofs_size_bytesOption<i64>EROFS image size in bytes
positioni32Layer position, where 0 is the bottom

ImagePruneReport

<p className="msb-backref">Returned by <a href="#image-prune">prune()</a></p>

Summary of cached image data removed by Image::prune().

FieldTypeDescription
image_refs_removedu32Cached image references removed from the local image index
manifests_removedu32OCI manifests removed from the local image index
layers_removedu32Layer records removed from the local image index
fsmeta_removedu32Merged fsmeta EROFS artifacts removed from disk
vmdk_removedu32VMDK descriptor artifacts removed from disk
bytes_reclaimedOption<u64>Best-effort measured bytes reclaimed from deleted artifacts

ImageArchiveFormat

<div className="msb-tags"><span className="msb-tag is-type">enum</span></div> <p className="msb-backref">Used by <a href="#image-save">save()</a></p>

Archive layout to write when exporting images with Image::save().

VariantDescription
DockerDocker docker save compatible archive (default)
OciOCI Image Layout archive