omni_forge/image_builder/ensure/
ensure_docker.rs1use 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}