From c4176723f398d2293d4623022b913d4bdfb69912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=81=AB=E8=8A=B1?= Date: Thu, 17 Apr 2025 16:34:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(spec):=E7=94=9F=E6=88=90spec=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=E8=A1=A5=E5=85=85cwd=E4=BF=A1=E6=81=AF=20(#7?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/service/src/containerd_manager.rs | 4 +--- crates/service/src/image_manager.rs | 16 +++++++++++++--- crates/service/src/spec.rs | 10 ++++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/crates/service/src/containerd_manager.rs b/crates/service/src/containerd_manager.rs index 39c5a33..845c762 100644 --- a/crates/service/src/containerd_manager.rs +++ b/crates/service/src/containerd_manager.rs @@ -454,9 +454,7 @@ impl ContainerdManager { fn get_spec(cid: &str, ns: &str, image_name: &str) -> Result, ContainerdError> { let config = ImageManager::get_runtime_config(image_name).unwrap(); - let env = config.env; - let args = config.args; - let spec_path = generate_spec(cid, ns, args, env).map_err(|e| { + let spec_path = generate_spec(cid, ns, &config).map_err(|e| { log::error!("Failed to generate spec: {}", e); ContainerdError::GenerateSpecError(e.to_string()) })?; diff --git a/crates/service/src/image_manager.rs b/crates/service/src/image_manager.rs index 1311d1e..c2afcb9 100644 --- a/crates/service/src/image_manager.rs +++ b/crates/service/src/image_manager.rs @@ -28,11 +28,17 @@ pub struct ImageRuntimeConfig { pub env: Vec, pub args: Vec, pub ports: Vec, + pub cwd: String, } impl ImageRuntimeConfig { - pub fn new(env: Vec, args: Vec, ports: Vec) -> Self { - ImageRuntimeConfig { env, args, ports } + pub fn new(env: Vec, args: Vec, ports: Vec, cwd: String) -> Self { + ImageRuntimeConfig { + env, + args, + ports, + cwd, + } } } @@ -387,7 +393,11 @@ impl ImageManager { .exposed_ports() .clone() .expect("Failed to get exposed ports"); - Ok(ImageRuntimeConfig::new(env, args, ports)) + let cwd = config + .working_dir() + .clone() + .expect("Failed to get working dir"); + Ok(ImageRuntimeConfig::new(env, args, ports, cwd)) } else { Err(ImageError::ImageConfigurationNotFound(format!( "Image configuration is empty for image {}", diff --git a/crates/service/src/spec.rs b/crates/service/src/spec.rs index 691ab85..b7cfe05 100644 --- a/crates/service/src/spec.rs +++ b/crates/service/src/spec.rs @@ -1,6 +1,8 @@ use serde::{Deserialize, Serialize}; use std::fs::File; +use crate::image_manager::ImageRuntimeConfig; + // 定义版本的常量 const VERSION_MAJOR: u32 = 1; const VERSION_MINOR: u32 = 1; @@ -319,16 +321,16 @@ fn get_netns(ns: &str, cid: &str) -> String { pub fn generate_spec( id: &str, ns: &str, - args: Vec, - env: Vec, + runtime_config: &ImageRuntimeConfig, ) -> Result { let namespace = match ns { "" => DEFAULT_NAMESPACE, _ => ns, }; let mut spec = populate_default_unix_spec(id, ns); - spec.process.args = args; - spec.process.env = env; + spec.process.args = runtime_config.args.clone(); + spec.process.env = runtime_config.env.clone(); + spec.process.cwd = runtime_config.cwd.clone(); let dir_path = format!("{}/{}", PATH_TO_SPEC_PREFIX, namespace); let path = format!("{}/{}.json", dir_path, id); std::fs::create_dir_all(&dir_path)?;