mirror of
https://github.com/mii443/rs-docker-bot.git
synced 2025-08-22 16:15:40 +00:00
adding container to pool automatically
This commit is contained in:
@ -1,8 +1,15 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use bollard::{
|
||||||
|
container::{RemoveContainerOptions, StopContainerOptions},
|
||||||
|
Docker,
|
||||||
|
};
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
use crate::{docker::Container, language::Language};
|
use crate::{
|
||||||
|
docker::{docker_ps, Container},
|
||||||
|
language::Language,
|
||||||
|
};
|
||||||
|
|
||||||
pub struct ContainerPool {
|
pub struct ContainerPool {
|
||||||
pub containers: Arc<Mutex<Vec<Container>>>,
|
pub containers: Arc<Mutex<Vec<Container>>>,
|
||||||
@ -25,6 +32,12 @@ impl ContainerPool {
|
|||||||
}
|
}
|
||||||
}) {
|
}) {
|
||||||
println!("Using container from pool");
|
println!("Using container from pool");
|
||||||
|
let container_pool = self.containers.clone();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
let container = Container::from_language(language).await;
|
||||||
|
container_pool.lock().await.push(container);
|
||||||
|
println!("Added contaienr to pool");
|
||||||
|
});
|
||||||
let container = pool[i].clone();
|
let container = pool[i].clone();
|
||||||
pool.remove(i);
|
pool.remove(i);
|
||||||
container
|
container
|
||||||
@ -34,9 +47,42 @@ impl ContainerPool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn add_container(&mut self, language: Language) {
|
pub async fn add_container(&mut self, language: Language) {
|
||||||
self.containers
|
println!("Adding container to pool... {}", language.image);
|
||||||
.lock()
|
let container = Container::from_language(language).await;
|
||||||
.await
|
self.containers.lock().await.push(container);
|
||||||
.push(Container::from_language(language).await);
|
}
|
||||||
|
|
||||||
|
pub async fn cleanup(&mut self) {
|
||||||
|
let docker = Docker::connect_with_local_defaults().unwrap();
|
||||||
|
|
||||||
|
let containers = docker_ps().await;
|
||||||
|
println!("{}", containers.len());
|
||||||
|
for container in &containers {
|
||||||
|
if container
|
||||||
|
.names
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.iter()
|
||||||
|
.find(|name| name.starts_with("/dockerbot-"))
|
||||||
|
.is_some()
|
||||||
|
{
|
||||||
|
println!("Stopping {}", container.id.clone().unwrap());
|
||||||
|
let id = container.id.clone().unwrap();
|
||||||
|
docker
|
||||||
|
.stop_container(&id, Some(StopContainerOptions { t: 5 }))
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
docker
|
||||||
|
.remove_container(
|
||||||
|
&id,
|
||||||
|
Some(RemoveContainerOptions {
|
||||||
|
force: true,
|
||||||
|
..Default::default()
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ pub async fn docker_ps() -> Vec<ContainerSummary> {
|
|||||||
let docker = Docker::connect_with_local_defaults().unwrap();
|
let docker = Docker::connect_with_local_defaults().unwrap();
|
||||||
|
|
||||||
let options = ListContainersOptions::<String> {
|
let options = ListContainersOptions::<String> {
|
||||||
|
all: true,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -44,22 +44,14 @@ async fn on_message(ctx: &serenity::Context, data: &Data, new_message: &Message)
|
|||||||
let language = config.get_language(&String::from(language));
|
let language = config.get_language(&String::from(language));
|
||||||
|
|
||||||
if let Some(language) = language {
|
if let Some(language) = language {
|
||||||
let mut message = new_message
|
|
||||||
.reply(&ctx.http, format!("Creating {} container.", language.name))
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let container = {
|
let container = {
|
||||||
let mut pool = data.container_pool.lock().await;
|
let mut pool = data.container_pool.lock().await;
|
||||||
pool.get_container(language.clone()).await
|
pool.get_container(language.clone()).await
|
||||||
};
|
};
|
||||||
let file_name = format!("{}.{}", container.name, language.extension.clone());
|
let file_name = format!("{}.{}", container.name, language.extension.clone());
|
||||||
|
|
||||||
message
|
let mut message = new_message
|
||||||
.edit(
|
.reply(&ctx.http, format!("Container created: {}", container.id))
|
||||||
&ctx.http,
|
|
||||||
EditMessage::new().content(format!("Created: {}", container.id)),
|
|
||||||
)
|
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -51,9 +51,11 @@ async fn main() -> Result<(), ()> {
|
|||||||
serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT;
|
serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT;
|
||||||
|
|
||||||
let mut pool = ContainerPool::new();
|
let mut pool = ContainerPool::new();
|
||||||
for _ in 0..10 {
|
pool.cleanup().await;
|
||||||
pool.add_container(config.get_language(&"Ruby".to_string()).unwrap())
|
for _ in 0..3 {
|
||||||
.await;
|
for language in &config.languages {
|
||||||
|
pool.add_container(language.clone()).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let framework = poise::Framework::builder()
|
let framework = poise::Framework::builder()
|
||||||
|
Reference in New Issue
Block a user