diff --git a/src/deploy/container.rs b/src/deploy/container.rs index c1f7402..ba235d8 100644 --- a/src/deploy/container.rs +++ b/src/deploy/container.rs @@ -1,4 +1,4 @@ -use bollard::container::{StartContainerOptions, CreateContainerOptions, Config, NetworkingConfig}; +use bollard::container::{StartContainerOptions, CreateContainerOptions, Config, NetworkingConfig, ListContainersOptions}; use bollard::models::{EndpointSettings, EndpointIpamConfig}; use bollard::errors::Error; use std::collections::hash_map::HashMap; @@ -36,12 +36,15 @@ impl Container { } async fn create(&self, docker: bollard::Docker) -> Result{ - let create = docker.create_container(Some( + let id_container = match self.exist_container(docker.clone()).await? { + Some(id_ret) => id_ret, + None => docker.create_container(Some( create_options(self.name.clone())), create_config(self.ip.clone(), self.net.clone())) - .await?; + .await?.id, + }; docker.start_container(&self.name, None::>).await?; - return Ok(create.id); + Ok(id_container) } pub fn get_id(&self) -> String { @@ -50,7 +53,30 @@ impl Container { None => String::from(""), } } + + async fn exist_container(&self, docker: bollard::Docker) -> Result, Error> { + let list = docker.list_containers( + Some(create_search_container(self.name.clone())) + ).await?; + Ok (if list.len() > 0 { + list[0].id.clone() + } else { + None + }) + } } + +fn create_search_container(name: String) -> ListContainersOptions { + let mut filters = HashMap::new(); + filters.insert("name".to_string(), vec![name]); + + ListContainersOptions{ + all: true, + filters, + ..Default::default() + } +} + fn create_config(ip: String, net: String) -> Config { let endpoint = EndpointSettings { ipam_config: Some(EndpointIpamConfig{ @@ -79,9 +105,3 @@ fn create_options(name: String) -> CreateContainerOptions { platform: None, } } - -async fn create(docker: bollard::Docker, name: String, ip: String, net: String) -> Result{ - let create = docker.create_container(Some(create_options(name.clone())), create_config(ip, net)).await?; - docker.start_container(&name, None::>).await?; - return Ok(create.id); -} diff --git a/src/server.rs b/src/server.rs index 11234b8..58e8a5c 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,4 +1,4 @@ -use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder,middleware::Logger}; +use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder}; use bollard::Docker; use env_logger; @@ -38,7 +38,6 @@ pub async fn start() -> std::io::Result<()> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("debug")); HttpServer::new(move || { App::new() - .wrap(Logger::default()) .app_data(data.clone()) .service(hello) .service(create)