diff --git a/xc/src/container/runner/mod.rs b/xc/src/container/runner/mod.rs index 16e135d..71cd637 100644 --- a/xc/src/container/runner/mod.rs +++ b/xc/src/container/runner/mod.rs @@ -250,7 +250,13 @@ impl ProcessRunner { .jail(&jail); if let Some(work_dir) = &exec.work_dir { - cmd.jwork_dir(work_dir); + // god damn it Docker + if !work_dir.is_empty() { + let path = std::path::Path::new(&work_dir); + if path.is_absolute() { + cmd.jwork_dir(work_dir); + } + } } let devnull = std::path::PathBuf::from("/dev/null"); let spawn_info_result = match &exec.output_mode { @@ -569,7 +575,7 @@ impl ProcessRunner { self.container.main_started_notify.notify_waiters(); } } - Err(error) => error!("cannot spawn {id}: {error:#?}"), + Err(error) => error!("cannot spawn {id}: {process:#?} {error:#?}"), } } diff --git a/xc/src/models/jail_image.rs b/xc/src/models/jail_image.rs index 67a92cb..58b3b60 100644 --- a/xc/src/models/jail_image.rs +++ b/xc/src/models/jail_image.rs @@ -308,13 +308,20 @@ impl JailConfig { } pub fn from_json(value: serde_json::Value) -> Option { - serde_json::from_value::(value.clone()) - .ok() - .or_else(|| { - serde_json::from_value::(value) - .ok() - .and_then(Self::from_oci) - }) + let maybe_converted = serde_json::from_value::(value.clone()).ok()?; + // .expect(&format!("unknown format: {value}")); + if maybe_converted + .clone() + .oci_config + .config + .and_then(|c| c.xc_extension) + .is_none() + { + let ociconfig = serde_json::from_value::(value).ok()?; + Self::from_oci(ociconfig) + } else { + Some(maybe_converted) + } } pub fn from_oci(config: OciConfig) -> Option { diff --git a/xcd/src/image/pull.rs b/xcd/src/image/pull.rs index 7415bae..c88d3e0 100644 --- a/xcd/src/image/pull.rs +++ b/xcd/src/image/pull.rs @@ -200,6 +200,9 @@ pub async fn pull_image( }); let jail_image = JailConfig::from_json(config).ok_or(PullImageError::ConfigConvertFail)?; + + eprintln!("jail_image: {jail_image:#?}"); + _ = emitter.use_try(|state| { state.jail_image = Some(jail_image.clone()); Ok(())