chord_util/docker/
image.rs1use 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}