From dd6e36889b188430a74f8260d395eef94a830fdd Mon Sep 17 00:00:00 2001 From: Jean-Gabriel Gill-Couture Date: Mon, 19 Jan 2026 16:48:38 -0500 Subject: [PATCH] feat(tools): docker autoinstall checks with docker info now and calls rootless setup helper after install --- harmony_tools/src/docker.rs | 46 +++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/harmony_tools/src/docker.rs b/harmony_tools/src/docker.rs index bc8cfc9..3dfbacd 100644 --- a/harmony_tools/src/docker.rs +++ b/harmony_tools/src/docker.rs @@ -87,28 +87,27 @@ impl Docker { PathBuf::from("docker") } - /// Checks if docker is installed and available in the PATH + /// Checks if Docker is installed and the daemon is responsive. pub fn is_installed(&self) -> bool { - let bin_path = self.get_bin_path(); - trace!("Checking if Docker is installed at: {:?}", bin_path); + trace!("Checking if Docker is installed and responsive"); - std::process::Command::new(&bin_path) - .arg("--version") + self.command() + .arg("info") .output() .map(|output| { if output.status.success() { - trace!("Docker version check successful"); + trace!("Docker daemon is responsive"); true } else { trace!( - "Docker version check failed with status: {:?}", + "Docker daemon check failed with status: {:?}", output.status ); false } }) .map_err(|e| { - trace!("Failed to execute Docker version check: {}", e); + trace!("Failed to execute Docker daemon check: {}", e); e }) .unwrap_or(false) @@ -183,6 +182,32 @@ impl Docker { if status.success() { info!("{} installed successfully", variant); if variant == DockerVariant::Rootless { + info!("Running rootless setup tool to install dependencies and start service..."); + let mut setup_cmd = std::process::Command::new("sh"); + + // Set PATH to include ~/bin where the script was likely installed + if let Ok(home) = std::env::var("HOME") { + let bin_path = format!("{}/bin", home); + if let Ok(current_path) = std::env::var("PATH") { + setup_cmd.env("PATH", format!("{}:{}", bin_path, current_path)); + } + setup_cmd.arg(format!("{}/bin/dockerd-rootless-setuptool.sh", home)); + } else { + setup_cmd.arg("dockerd-rootless-setuptool.sh"); + } + + setup_cmd.arg("install"); + + debug!("Executing rootless setup command: {:?}", setup_cmd); + let setup_status = setup_cmd.status().map_err(|e| { + error!("Failed to execute rootless setup tool: {}", e); + format!("Failed to execute rootless setup tool: {}", e) + })?; + + if !setup_status.success() { + warn!("Rootless setup tool finished with non-zero exit code. You may need to install 'uidmap' or start the service manually."); + } + warn!("Please follow the instructions above to finish rootless setup (environment variables)."); } @@ -192,9 +217,10 @@ impl Docker { Ok(()) } else { error!( - "{} installation script failed with exit code: {:?}", + "{} installation script failed with exit code: {:?} \n\nOutput:\n{:?}", variant, - status.code() + status.code(), + cmd.output(), ); Err(format!("{} installation script failed", variant)) }