mcai_docker/
lib.rs

1pub mod container;
2pub mod error;
3pub mod image;
4
5pub use bollard::{auth::DockerCredentials, Docker};
6
7use crate::error::Result;
8use crate::image::Image;
9use std::io::Write;
10
11pub struct McaiDocker {
12  credentials: Option<DockerCredentials>,
13  docker: Docker,
14}
15
16pub struct ConfigOptions {}
17
18impl McaiDocker {
19  pub fn new(docker: Docker) -> Self {
20    McaiDocker {
21      docker,
22      credentials: None,
23    }
24  }
25
26  pub fn with_credential(mut self, credentials: DockerCredentials) -> Self {
27    self.credentials = Some(credentials);
28    self
29  }
30
31  pub async fn describe_worker(
32    &self,
33    docker_image_name: &str,
34    stream: Option<&mut (dyn Write + Send)>,
35  ) -> Result<()> {
36    let builder = Image::new(docker_image_name)
37      .with_optional_credentials(self.credentials.clone())
38      .build(&self.docker)
39      .await?;
40    let container = builder.with_env("DESCRIBE", &1).build(&self.docker).await?;
41    container.run(&self.docker, stream).await?;
42    container.remove(&self.docker, true).await
43  }
44
45  pub async fn run_worker_with_source_orders(
46    &self,
47    docker_image_name: &str,
48    source_orders: &[&str],
49    stream: Option<&mut (dyn Write + Send)>,
50  ) -> Result<()> {
51    self
52      .run_worker(
53        docker_image_name,
54        &[("SOURCE_ORDERS", &source_orders.join(":"))],
55        stream,
56      )
57      .await
58  }
59
60  pub async fn run_worker(
61    &self,
62    docker_image_name: &str,
63    envs: &[(&str, &(dyn ToString + Send + Sync))],
64    stream: Option<&mut (dyn Write + Send)>,
65  ) -> Result<()> {
66    let builder = Image::new(docker_image_name)
67      .with_optional_credentials(self.credentials.clone())
68      .build(&self.docker)
69      .await?;
70
71    let container = builder
72      .with_enable_tty()
73      .with_envs(envs)
74      .build(&self.docker)
75      .await?;
76    container.run(&self.docker, stream).await?;
77    container.remove(&self.docker, true).await
78  }
79}