summaryrefslogtreecommitdiffstats
path: root/examples/export.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/export.rs')
-rw-r--r--examples/export.rs38
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)
}