Skip to main content

chord_util/docker/
image.rs

1use std::sync::Arc;
2
3use log::{trace, warn};
4use reqwest::Method;
5
6use chord_core::future::task::spawn;
7
8use crate::docker::container::{Arg, Container};
9use crate::docker::engine::Engine;
10use crate::docker::Error;
11use crate::docker::Error::*;
12
13pub struct Image {
14    engine: Arc<Engine>,
15    name: String,
16}
17
18impl Image {
19    pub fn name(&self) -> &str {
20        self.name.as_str()
21    }
22
23    pub async fn new(engine: Arc<Engine>, name: &str) -> Result<Image, Error> {
24        let name = if name.contains(":") {
25            name.into()
26        } else {
27            format!("{}:latest", name)
28        };
29
30        trace!("image create {}", name);
31        engine
32            .call(
33                format!("images/create?fromImage={}", name).as_str(),
34                Method::POST,
35                None,
36                1,
37            )
38            .await
39            .map(|_| Image { engine, name })
40    }
41
42    pub async fn container_create(&self, name: &str, arg: Arg) -> Result<Container, Error> {
43        let arg = arg.image(self.name.clone());
44        return Container::new(self.engine.clone(), name, arg).await;
45    }
46}
47
48impl Drop for Image {
49    fn drop(&mut self) {
50        let uri = format!("images/{}", self.name);
51        let name = self.name.clone();
52        let engine = self.engine.clone();
53        let _ = spawn(async move {
54            engine
55                .call(uri.as_str(), Method::DELETE, None, 1)
56                .await
57                .map_err(|e| {
58                    if let Status(404) = e {
59                        trace!("image not found {}", name);
60                    } else {
61                        warn!("image remove fail {}, {}", name, e);
62                    }
63                })
64                .map(|_| {
65                    trace!("image remove {}", name);
66                })
67        });
68    }
69}