From a7a97fc2995f14d8b0ebc0caef99f4741f3655db Mon Sep 17 00:00:00 2001 From: xfy Date: Sun, 5 Jul 2026 22:05:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(code-runner):=20=E5=8E=BB=E6=8E=89=20nproc?= =?UTF-8?q?=20ulimit=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=AE=B9=E5=99=A8=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=20EAGAIN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 容器启动时报 'exec /bin/sh: resource temporarily unavailable',根因是 HostConfig 里的 ulimit nproc=64 与 non-root user(1000:1000) 组合: RLIMIT_NPROC 按 UID 计数且在容器初始 exec 阶段就生效,与容器内实际进程数无关, 导致 sh 都起不来。pids_limit=64 已在 cgroup 层兜底进程数限制,nproc 是冗余且 有害的双重约束。 复现:docker run --ulimit nproc=64 --user 1000:1000 → exec 失败 去掉 nproc(保留 nofile + pids_limit + 其他沙箱约束)→ python/node 正常运行 cargo test infra::docker 全过。 --- src/infra/docker.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/infra/docker.rs b/src/infra/docker.rs index 42c84e4..3e5a33b 100644 --- a/src/infra/docker.rs +++ b/src/infra/docker.rs @@ -31,9 +31,12 @@ pub fn build_host_config(limits: &ResourceLimits) -> HostConfig { readonly_rootfs: Some(true), tmpfs: Some(tmpfs), pids_limit: Some(64), + // 只保留 nofile(fd 数上限,语义正常)。 + // 不设 nproc:RLIMIT_NPROC 在 setrlimit 时按 UID 计数,配合 non-root 用户会让 + // 容器初始 exec /bin/sh 直接 EAGAIN("exec: resource temporarily unavailable"), + // 与容器内实际进程数无关。pids_limit 已在 cgroup 层兜底,nproc 是冗余且有害的双重约束。 ulimits: Some(vec![ ResourcesUlimits { name: Some("nofile".to_string()), soft: Some(64), hard: Some(64) }, - ResourcesUlimits { name: Some("nproc".to_string()), soft: Some(64), hard: Some(64) }, ]), cap_drop: Some(vec!["ALL".to_string()]), security_opt: Some(vec!["no-new-privileges".to_string()]),