refactor(sandbox): 长期容器 + docker exec 替代一次性 docker run
容器策略从"每次 docker run 一次性容器"改为"长期容器 + docker exec": - 统一产物目录 tools/bin/:build.sh 和 tool_manager 编译后复制产物到 此目录,registry 解析路径优先用 tools/bin/<tool>。 - 长期容器 ias-sandbox:daemon 启动时 ensure(已运行则复用), tools/bin 只读挂载到 /tools,无网络/只读根/cap-drop ALL/资源限制。 - docker exec 调用:工具执行改为 docker exec -i ias-sandbox timeout -k 5 <secs> /tools/<name>,省去容器创建开销。 timeout -k 5 确保超时 SIGTERM→SIGKILL,无孤儿进程。 - 新增 src/tools/sandbox.rs:ensure_container + build_exec_cmd。 - executor 删除 build_docker_cmd/sandbox_enabled,docker 分支改用 sandbox::build_exec_cmd。 - env 按 spec 白名单 -e 注入(容器启动时仅有 PATH)。 验证:本地执行 hostname=debian,docker exec hostname=容器ID, 证明确实走长期容器 exec;25 测试通过。
This commit is contained in:
+5
-4
@@ -1,17 +1,18 @@
|
||||
#!/bin/bash
|
||||
# 构建所有工具
|
||||
# 构建所有工具,产物统一收集到 bin/ 供长期沙箱容器挂载
|
||||
set -e
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
TOOLS=(datetime weather amap web_search fetch_page memories tool_manager)
|
||||
|
||||
mkdir -p bin
|
||||
|
||||
echo "=== 构建工具 ==="
|
||||
for tool in "${TOOLS[@]}"; do
|
||||
echo " $tool..."
|
||||
(cd "$tool" && cargo build --release --quiet)
|
||||
cp "$tool/target/release/$tool" "bin/$tool"
|
||||
done
|
||||
|
||||
echo "=== 完成 ==="
|
||||
for tool in "${TOOLS[@]}"; do
|
||||
ls -lh "$tool/target/release/$tool" 2>/dev/null
|
||||
done
|
||||
ls -lh bin/*
|
||||
|
||||
@@ -175,6 +175,16 @@ fn build_tool(tool_dir: &Path, tool_name: &str) -> Result<(), String> {
|
||||
if !binary.exists() {
|
||||
return Err(format!("构建后未找到二进制: {}", binary.display()));
|
||||
}
|
||||
|
||||
// 复制到统一产物目录 tools/bin/,供长期沙箱容器挂载使用
|
||||
let tools_root = tool_dir
|
||||
.parent()
|
||||
.ok_or_else(|| "无法定位 tools 根目录".to_string())?;
|
||||
let bin_dir = tools_root.join("bin");
|
||||
fs::create_dir_all(&bin_dir).map_err(|e| format!("创建产物目录失败: {e}"))?;
|
||||
fs::copy(&binary, bin_dir.join(tool_name))
|
||||
.map_err(|e| format!("复制产物到 bin 失败: {e}"))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user