diff --git a/config.example.toml b/config.example.toml index 5afa0f10..3dad10b9 100644 --- a/config.example.toml +++ b/config.example.toml @@ -18,5 +18,5 @@ key_path = "keys.example.json" [[modules]] id = "DA_COMMIT" -path = "target/debug/da_commit" -sleep_secs = 5 +docker_image="da_commit" +sleep_secs = 5 \ No newline at end of file diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 689017ec..c407fa6f 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -23,3 +23,5 @@ eyre.workspace = true tree_hash.workspace = true tree_hash_derive.workspace = true + +bollard = "0.16.1" \ No newline at end of file diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index e9400082..b2c7413e 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -69,24 +69,38 @@ impl Args { Command::Start { config: config_path } => { let config = CommitBoostConfig::from_file(&config_path); + // Initialize Docker client + let docker = bollard::Docker::connect_with_local_defaults().expect("Failed to connect to Docker"); + if let Some(modules) = config.modules { let signer_config = config.signer.expect("missing signer config with modules"); - - // this mocks the commit boost client starting containers, processes etc - let mut child_handles = Vec::with_capacity(modules.len()); + // start signing server + tokio::spawn(SigningService::run(config.chain, signer_config)); for module in modules { - let child = std::process::Command::new(module.path) - .env(MODULE_ID_ENV, module.id) - .env(CONFIG_PATH_ENV, &config_path) - .spawn() - .expect("failed to start process"); + let config = bollard::container::Config { + image: Some(module.docker_image.clone()), + host_config: Some(bollard::secret::HostConfig { + binds: { + let full_config_path = std::fs::canonicalize(&config_path).unwrap().to_string_lossy().to_string(); + Some(vec![format!("{}:{}", full_config_path, "/config.toml")]) + }, + network_mode: Some(String::from("host")), // Use the host network + ..Default::default() + }), + env: Some(vec![ + format!("{}={}", MODULE_ID_ENV, module.id), + format!("{}={}", CONFIG_PATH_ENV, "/config.toml"), + ]), + ..Default::default() + }; - child_handles.push(child); - } + let container = docker.create_container::<&str, String>(None, config).await?; + let container_id = container.id; + docker.start_container::(&container_id, None).await?; - // start signing server - tokio::spawn(SigningService::run(config.chain, signer_config)); + println!("Started container: {} from image {}", container_id, module.docker_image); + } } // start pbs server diff --git a/crates/common/src/config.rs b/crates/common/src/config.rs index 8d0b6b28..f54018e2 100644 --- a/crates/common/src/config.rs +++ b/crates/common/src/config.rs @@ -115,7 +115,7 @@ const fn default_u256() -> U256 { #[derive(Debug, Deserialize, Serialize)] pub struct ModuleConfig { pub id: String, - pub path: String, + pub docker_image: String, #[serde(flatten)] pub extra: T, } diff --git a/crates/pbs/src/boost.rs b/crates/pbs/src/boost.rs index a0c1b34e..6e515d2e 100644 --- a/crates/pbs/src/boost.rs +++ b/crates/pbs/src/boost.rs @@ -14,7 +14,7 @@ use crate::{ #[async_trait] pub trait BuilderApi: 'static { /// Use to extend the BuilderApi - fn routes() -> Option>> { + fn extra_routes() -> Option>> { None } diff --git a/crates/pbs/src/routes/router.rs b/crates/pbs/src/routes/router.rs index 3f37e4cb..e8a7af3a 100644 --- a/crates/pbs/src/routes/router.rs +++ b/crates/pbs/src/routes/router.rs @@ -25,7 +25,7 @@ pub fn create_app_router>(state: BuilderSta let builder_api = Router::new().nest(BULDER_API_PATH, builder_routes); - let app = if let Some(extra_routes) = T::routes() { + let app = if let Some(extra_routes) = T::extra_routes() { builder_api.merge(extra_routes) } else { builder_api diff --git a/examples/custom_boost.rs b/examples/custom_boost.rs index 153f611c..e5fa7e18 100644 --- a/examples/custom_boost.rs +++ b/examples/custom_boost.rs @@ -42,7 +42,7 @@ impl BuilderApi for MyBuilderApi { Ok(()) } - fn routes() -> Option>> { + fn extra_routes() -> Option>> { let router = Router::new().route("/custom/stats", get(handle_stats)); Some(router) }