#[cfg(feature = "compose")]
use docker_wrapper::command::ComposeCommand;
#[cfg(feature = "compose")]
use docker_wrapper::compose::{
ComposeDownCommand, ComposeLogsCommand, ComposePsCommand, ComposeUpCommand, RemoveImages,
};
#[cfg(feature = "compose")]
use docker_wrapper::DockerCommand;
#[cfg(feature = "compose")]
use std::time::Duration;
#[cfg(not(feature = "compose"))]
fn main() {
println!("This example requires the 'compose' feature.");
println!("Run with: cargo run --example docker_compose --features compose");
}
#[cfg(feature = "compose")]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Docker Compose Management Example");
println!("=================================\n");
println!("Example 1: Basic Compose Workflow");
println!("------------------------------------");
println!("Starting services with compose up...");
let up_result = ComposeUpCommand::new()
.file("docker-compose.yml")
.project_name("my-app")
.detach() .build() .remove_orphans() .wait() .wait_timeout(Duration::from_secs(60))
.execute()
.await;
match up_result {
Ok(result) => {
println!("Services started successfully");
println!("Output: {}", result.stdout.trim());
}
Err(e) => {
println!("Failed to start services: {}", e);
}
}
println!();
println!("Example 2: Checking Service Status");
println!("-------------------------------------");
let ps_result = ComposePsCommand::new()
.file("docker-compose.yml")
.project_name("my-app")
.all() .execute()
.await;
match ps_result {
Ok(result) => {
println!("Service status retrieved");
println!("Output: {}", result.stdout.trim());
}
Err(e) => println!("Could not retrieve service status: {}", e),
}
println!();
println!("Example 3: Viewing Service Logs");
println!("----------------------------------");
let logs_result = ComposeLogsCommand::new()
.file("docker-compose.yml")
.project_name("my-app")
.tail("20") .timestamps() .no_color() .service("web") .execute()
.await;
match logs_result {
Ok(result) => {
println!("Logs retrieved");
println!("Output: {}", result.stdout.trim());
}
Err(e) => println!("Could not retrieve logs: {}", e),
}
println!();
println!("Example 4: Advanced Compose Configuration");
println!("---------------------------------------------");
println!("Starting services with scaling...");
let scaled_up = ComposeUpCommand::new()
.file("docker-compose.yml")
.project_name("scaled-app")
.scale("web", 3) .scale("worker", 2) .detach()
.no_recreate() .execute()
.await;
match scaled_up {
Ok(_) => {
println!("Services scaled successfully");
println!(" web: 3 instances");
println!(" worker: 2 instances");
}
Err(e) => println!(
"Scaling failed (expected without valid compose file): {}",
e
),
}
println!();
println!("Example 5: Selective Service Management");
println!("------------------------------------------");
let selective_up = ComposeUpCommand::new()
.file("docker-compose.yml")
.service("database") .service("cache") .no_deps() .detach()
.execute()
.await;
match selective_up {
Ok(_) => println!("Selected services started"),
Err(e) => println!(
"Selective start failed (expected without valid compose file): {}",
e
),
}
println!();
println!("Example 6: Clean Shutdown");
println!("----------------------------");
let down_result = ComposeDownCommand::new()
.file("docker-compose.yml")
.project_name("my-app")
.volumes() .remove_images(RemoveImages::Local) .remove_orphans() .timeout(Duration::from_secs(30)) .execute()
.await;
match down_result {
Ok(_) => println!("Services stopped and cleaned up"),
Err(e) => println!("Cleanup failed (expected without running services): {}", e),
}
println!();
println!("Example 7: Development Workflow Patterns");
println!("----------------------------------");
println!("Common development compose patterns:");
println!();
println!("1. Development mode with auto-rebuild:");
println!(" ComposeUpCommand::new()");
println!(" .file(\"docker-compose.dev.yml\")");
println!(" .build() // Always rebuild");
println!(" .force_recreate() // Fresh containers");
println!(" .remove_orphans()");
println!(" .execute()");
println!();
println!("2. Production deployment:");
println!(" ComposeUpCommand::new()");
println!(" .file(\"docker-compose.prod.yml\")");
println!(" .detach()");
println!(" .wait() // Wait for health checks");
println!(" .execute()");
println!();
println!("3. Testing with isolated environment:");
println!(" ComposeUpCommand::new()");
println!(" .project_name(format!(\"test-{{}}\", uuid))");
println!(" .abort_on_container_exit() // Stop when test completes");
println!(" .exit_code_from(\"tests\") // Use test exit code");
println!(" .execute()");
println!();
println!("4. Real-time log monitoring:");
println!(" ComposeLogsCommand::new()");
println!(" .follow() // Follow log output");
println!(" .timestamps()");
println!(" .service(\"app\")");
println!(" .execute()");
println!("\nDocker Compose example completed!");
println!("\nKey features demonstrated:");
println!(" - Starting services with compose up");
println!(" - Checking service status with compose ps");
println!(" - Viewing logs with compose logs");
println!(" - Scaling services");
println!(" - Selective service management");
println!(" - Clean shutdown with volume/image removal");
println!(" - Development workflow patterns");
Ok(())
}