diff options
Diffstat (limited to 'examples/export.rs')
-rw-r--r-- | examples/export.rs | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/examples/export.rs b/examples/export.rs index b12e2f8..b8d8eaf 100644 --- a/examples/export.rs +++ b/examples/export.rs @@ -1,22 +1,32 @@ extern crate shiplift; +extern crate tokio; -use shiplift::Docker; +use shiplift::{errors::Error, Docker}; use std::env; use std::fs::OpenOptions; -use std::io::copy; +use std::io::Write; +use tokio::prelude::{Future, Stream}; fn main() { let docker = Docker::new(); - if let Some(id) = env::args().nth(1) { - let mut export = OpenOptions::new() - .write(true) - .create(true) - .open(format!("{}.tgz", &id)) - .unwrap(); - let images = docker.images(); - let mut exported = images.get(&id).export().unwrap(); - println!("copying"); - copy(&mut exported, &mut export).unwrap(); - println!("copied"); - } + let id = env::args().nth(1).expect("You need to specify an image id"); + + let mut export_file = OpenOptions::new() + .write(true) + .create(true) + .open(format!("{}.tar", &id)) + .unwrap(); + let images = docker.images(); + let fut = images + .get(&id) + .export() + .for_each(move |bytes| { + export_file + .write(&bytes[..]) + .map(|n| println!("copied {} bytes", n)) + .map_err(Error::IO) + }) + .map_err(|e| eprintln!("Error: {}", e)); + + tokio::run(fut) } |