omni_forge/image_builder/ensure/
ensure_docker.rs

1use super::common::get_platform;
2use std::io::{self, Write};
3use std::process::Command;
4
5pub fn install_docker_platform() -> io::Result<()> {
6    let platform = get_platform();
7
8    match platform.as_str() {
9        "windows" => {
10            println!("Installing Docker Desktop for Windows...");
11            Command::new("winget")
12                .args(["install", "Docker.DockerDesktop"])
13                .status()?;
14        }
15        "darwin" => {
16            println!("Installing Docker Desktop for Mac...");
17            Command::new("brew")
18                .args(["install", "--cask", "docker"])
19                .status()?;
20        }
21        "linux" => {
22            let curl_output = Command::new("curl")
23                .args(["-fsSL", "https://download.docker.com/linux/ubuntu/gpg"])
24                .output()?;
25
26            let mut gpg = Command::new("gpg")
27                .args([
28                    "--dearmor",
29                    "-o",
30                    "/usr/share/keyrings/docker-archive-keyring.gpg",
31                ])
32                .stdin(std::process::Stdio::piped())
33                .spawn()?;
34
35            gpg.stdin.as_mut().unwrap().write_all(&curl_output.stdout)?;
36            gpg.wait()?;
37
38            let release = Command::new("lsb_release").arg("-cs").output()?;
39            let codename = String::from_utf8_lossy(&release.stdout).trim().to_string();
40
41            let repo = format!(
42                "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
43                https://download.docker.com/linux/ubuntu {} stable",
44                codename
45            );
46
47            std::fs::write("/etc/apt/sources.list.d/docker.list", repo)?;
48
49            Command::new("apt").args(["update"]).status()?;
50
51            Command::new("apt")
52                .args([
53                    "install",
54                    "-y",
55                    "docker-ce",
56                    "docker-ce-cli",
57                    "containerd.io",
58                ])
59                .status()?;
60        }
61        _ => return Err(io::Error::new(io::ErrorKind::Other, "Unsupported platform")),
62    }
63
64    Ok(())
65}