From 832b7c626d5926f81301621716b5264449604635 Mon Sep 17 00:00:00 2001 From: xfy Date: Wed, 15 Jul 2026 17:23:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(infra):=20Docker=20daemon=20=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E6=97=B6=E4=B8=8D=E5=86=8D=20panic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DOCKER_CLIENT 是 LazyLock,socket 缺失时 .expect() 直接 panic; 而 release profile 是 panic="abort",会让整个服务进程挂掉——但博客本身并不依赖 Docker。 改为 LazyLock>:连接失败记 error 日志后存 None。 新增 get_docker() 在 None 时返回 IOError(NotFound),run_in_container / run_in_container_stream 通过 ? 向上冒泡,最终在 execute.rs 的错误脱敏层映射为 「系统暂时不可用」,其余功能不受影响。 --- src/infra/docker.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/infra/docker.rs b/src/infra/docker.rs index 0ca76ee..1d26959 100644 --- a/src/infra/docker.rs +++ b/src/infra/docker.rs @@ -46,12 +46,14 @@ pub static DOCKER_CLIENT: LazyLock> = LazyLock::new(|| { /// `NotFound` 既不命中 `TimedOut` 也不命中超时判断,会走 execute.rs 的通用失败路径 /// (`ExecStatus::Failed` + 「系统暂时不可用」),不会误报成超时。 fn get_docker() -> Result<&'static Docker, bollard::errors::Error> { - DOCKER_CLIENT.as_ref().ok_or_else(|| bollard::errors::Error::IOError { - err: std::io::Error::new( - std::io::ErrorKind::NotFound, - "Docker daemon 不可用(未安装或未运行)", - ), - }) + DOCKER_CLIENT + .as_ref() + .ok_or_else(|| bollard::errors::Error::IOError { + err: std::io::Error::new( + std::io::ErrorKind::NotFound, + "Docker daemon 不可用(未安装或未运行)", + ), + }) } pub fn build_host_config(limits: &ResourceLimits) -> HostConfig {