Permit to start created containers

This commit is contained in:
2023-07-18 00:21:56 +02:00
parent 2023666c15
commit f078e9a032
2 changed files with 31 additions and 12 deletions

View File

@@ -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::models::{EndpointSettings, EndpointIpamConfig};
use bollard::errors::Error; use bollard::errors::Error;
use std::collections::hash_map::HashMap; use std::collections::hash_map::HashMap;
@@ -36,12 +36,15 @@ impl Container {
} }
async fn create(&self, docker: bollard::Docker) -> Result<String, Error>{ async fn create(&self, docker: bollard::Docker) -> Result<String, Error>{
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_options(self.name.clone())),
create_config(self.ip.clone(), self.net.clone())) create_config(self.ip.clone(), self.net.clone()))
.await?; .await?.id,
};
docker.start_container(&self.name, None::<StartContainerOptions<String>>).await?; docker.start_container(&self.name, None::<StartContainerOptions<String>>).await?;
return Ok(create.id); Ok(id_container)
} }
pub fn get_id(&self) -> String { pub fn get_id(&self) -> String {
@@ -50,7 +53,30 @@ impl Container {
None => String::from(""), None => String::from(""),
} }
} }
async fn exist_container(&self, docker: bollard::Docker) -> Result<Option<String>, 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<String> {
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<String> { fn create_config(ip: String, net: String) -> Config<String> {
let endpoint = EndpointSettings { let endpoint = EndpointSettings {
ipam_config: Some(EndpointIpamConfig{ ipam_config: Some(EndpointIpamConfig{
@@ -79,9 +105,3 @@ fn create_options(name: String) -> CreateContainerOptions<String> {
platform: None, platform: None,
} }
} }
async fn create(docker: bollard::Docker, name: String, ip: String, net: String) -> Result<String, Error>{
let create = docker.create_container(Some(create_options(name.clone())), create_config(ip, net)).await?;
docker.start_container(&name, None::<StartContainerOptions<String>>).await?;
return Ok(create.id);
}

View File

@@ -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 bollard::Docker;
use env_logger; 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")); env_logger::init_from_env(env_logger::Env::new().default_filter_or("debug"));
HttpServer::new(move || { HttpServer::new(move || {
App::new() App::new()
.wrap(Logger::default())
.app_data(data.clone()) .app_data(data.clone())
.service(hello) .service(hello)
.service(create) .service(create)