diff options
Diffstat (limited to '')
| -rw-r--r-- | src/docker.rs | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/src/docker.rs b/src/docker.rs index 6b8640a..d66767e 100644 --- a/src/docker.rs +++ b/src/docker.rs | |||
| @@ -23,19 +23,51 @@ impl DockerManager { | |||
| 23 | Ok(Self { client, config }) | 23 | Ok(Self { client, config }) |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | /// Map a Minecraft version string (e.g. "1.12.2", "1.20.1") to the | ||
| 27 | /// appropriate itzg/minecraft-server Java image tag. | ||
| 28 | /// | ||
| 29 | /// - < 1.17 → java8 (Minecraft 1.12.2 and earlier) | ||
| 30 | /// - 1.17 .. 1.20.4 → java17 | ||
| 31 | /// - >= 1.20.5 → java21 | ||
| 32 | fn java_tag(version: &str) -> &'static str { | ||
| 33 | // Parse major.minor from version strings like "1.12.2", "1.20.1", "1.21" | ||
| 34 | let parts: Vec<&str> = version.split('.').collect(); | ||
| 35 | if parts.len() < 2 { | ||
| 36 | return "java17"; // sensible default | ||
| 37 | } | ||
| 38 | let major: u32 = parts.first().and_then(|s| s.parse().ok()).unwrap_or(1); | ||
| 39 | let minor: u32 = parts.get(1).and_then(|s| s.parse().ok()).unwrap_or(12); | ||
| 40 | |||
| 41 | if major <= 1 && minor < 17 { | ||
| 42 | "java8" | ||
| 43 | } else if major <= 1 && minor < 21 { | ||
| 44 | // 1.17.x through 1.20.4 use Java 17 | ||
| 45 | "java17" | ||
| 46 | } else { | ||
| 47 | // 1.20.5+ and 1.21+ use Java 21 | ||
| 48 | "java21" | ||
| 49 | } | ||
| 50 | } | ||
| 51 | |||
| 52 | /// Build the full image reference, e.g. "itzg/minecraft-server:java8" | ||
| 53 | fn image_ref(version: &str) -> String { | ||
| 54 | format!("itzg/minecraft-server:{}", Self::java_tag(version)) | ||
| 55 | } | ||
| 56 | |||
| 26 | pub async fn start_container(&self, instance: &Instance) -> Result<(), String> { | 57 | pub async fn start_container(&self, instance: &Instance) -> Result<(), String> { |
| 27 | tracing::info!("Pulling itzg/minecraft-server:latest image..."); | 58 | let tag = Self::java_tag(&instance.version); |
| 28 | self.pull_image().await?; | 59 | tracing::info!("Pulling itzg/minecraft-server:{tag} image..."); |
| 60 | self.pull_image(tag).await?; | ||
| 29 | tracing::info!("Creating container for instance '{}'", instance.name); | 61 | tracing::info!("Creating container for instance '{}'", instance.name); |
| 30 | self.recreate_container(instance).await?; | 62 | self.recreate_container(instance).await?; |
| 31 | tracing::info!("Starting container..."); | 63 | tracing::info!("Starting container..."); |
| 32 | self.start_existing().await | 64 | self.start_existing().await |
| 33 | } | 65 | } |
| 34 | 66 | ||
| 35 | async fn pull_image(&self) -> Result<(), String> { | 67 | async fn pull_image(&self, tag: &str) -> Result<(), String> { |
| 36 | let options = CreateImageOptions { | 68 | let options = CreateImageOptions { |
| 37 | from_image: "itzg/minecraft-server", | 69 | from_image: "itzg/minecraft-server", |
| 38 | tag: "latest", | 70 | tag, |
| 39 | ..Default::default() | 71 | ..Default::default() |
| 40 | }; | 72 | }; |
| 41 | 73 | ||
| @@ -74,6 +106,8 @@ impl DockerManager { | |||
| 74 | .to_string(); | 106 | .to_string(); |
| 75 | let instance_data = format!("{server_dir}/instances/{}/data", instance.name); | 107 | let instance_data = format!("{server_dir}/instances/{}/data", instance.name); |
| 76 | 108 | ||
| 109 | let image_ref = Self::image_ref(&instance.version); | ||
| 110 | |||
| 77 | let mut env_strings: Vec<String> = vec