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 bollard::{
|
||||
container::{RemoveContainerOptions, StopContainerOptions},
|
||||
Docker,
|
||||
};
|
||||
use tokio::sync::Mutex;
|
||||
|
||||
use crate::{docker::Container, language::Language};
|
||||
use crate::{
|
||||
docker::{docker_ps, Container},
|
||||
language::Language,
|
||||
};
|
||||
|
||||
pub struct ContainerPool {
|
||||
pub containers: Arc<Mutex<Vec<Container>>>,
|
||||
@ -25,6 +32,12 @@ impl ContainerPool {
|
||||
}
|
||||
}) {
|
||||
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();
|
||||
pool.remove(i);
|
||||
container
|
||||
@ -34,9 +47,42 @@ impl ContainerPool {
|
||||
}
|
||||
|
||||
pub async fn add_container(&mut self, language: Language) {
|
||||
self.containers
|
||||
.lock()
|
||||
.await
|
||||
.push(Container::from_language(language).await);
|
||||
println!("Adding container to pool... {}", language.image);
|
||||
let container = Container::from_language(language).await;
|
||||
self.containers.lock().await.push(container);
|
||||
}
|
||||
|
||||
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 options = ListContainersOptions::<String> {
|
||||
all: true,
|
||||
..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));
|
||||
|
||||
if let Some(language) = language {
|
||||
let mut message = new_message
|
||||
.reply(&ctx.http, format!("Creating {} container.", language.name))
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let container = {
|
||||
let mut pool = data.container_pool.lock().await;
|
||||
pool.get_container(language.clone()).await
|
||||
};
|
||||
let file_name = format!("{}.{}", container.name, language.extension.clone());
|
||||
|
||||
message
|
||||
.edit(
|
||||
&ctx.http,
|
||||
EditMessage::new().content(format!("Created: {}", container.id)),
|
||||
)
|
||||
let mut message = new_message
|
||||
.reply(&ctx.http, format!("Container created: {}", container.id))
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
|
@ -51,9 +51,11 @@ async fn main() -> Result<(), ()> {
|
||||
serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT;
|
||||
|
||||
let mut pool = ContainerPool::new();
|
||||
for _ in 0..10 {
|
||||
pool.add_container(config.get_language(&"Ruby".to_string()).unwrap())
|
||||
.await;
|
||||
pool.cleanup().await;
|
||||
for _ in 0..3 {
|
||||
for language in &config.languages {
|
||||
pool.add_container(language.clone()).await;
|
||||
}
|
||||
}
|
||||
|
||||
let framework = poise::Framework::builder()
|
||||
|
Reference in New Issue
Block a user