| Crates.io | containerd-store |
| lib.rs | containerd-store |
| version | 0.1.0 |
| created_at | 2025-12-13 15:32:49.035866+00 |
| updated_at | 2025-12-13 15:32:49.035866+00 |
| description | Read-only access to containerd content and metadata for air-gapped image export |
| homepage | https://github.com/yorelog/docker-image-pusher |
| repository | https://github.com/yorelog/docker-image-pusher |
| max_upload_size | |
| id | 1983070 |
| size | 36,809 |
A small, read-only helper crate to explore containerd metadata and content. It resolves images from containerd's meta.db, finds their content digests, and can export or iterate images without needing a running daemon.
io.containerd.metadata.v1.bolt/meta.db) and read images by namespace.io.containerd.content.v1.content/blobs.meta.db) into a portable bundle; supports multiple images and deduplicates blobs.bucket-logging feature) to trace layout differences across vendors.use containerd_store::{ContainerdStore, ImageEntry};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let store = ContainerdStore::open(
"~/.local/share/containerd",
"default",
)?;
let images: Vec<ImageEntry> = store.list_images()?;
for img in &images {
println!("{} -> {} ({} bytes)", img.name, img.target.digest, img.target.size);
}
let resolved = store.resolve_image("busybox:latest")?;
println!("manifest at {}", resolved.manifest_path.display());
Ok(())
}
export_image_to_dir(&store, "busybox:latest", "./out")export_images_to_dir(&store, &["foo:tag", "bar:tag"], "./out")Exports include:
io.containerd.metadata.v1.bolt/meta.db (so bundles are self-contained)io.containerd.content.v1.content/blobs/Enable bucket-logging feature and register a logger:
containerd_store::set_bucket_match_logger(|m| {
eprintln!("matched {:?}: {}", m.kind, m.path.join("/"));
}).ok();
This is useful when debugging vendor-specific layout changes.
MIT