SuperAPI AI 工具集

hermes-s6-container-supervision

部署与运维

查看项目

更新于 10-16 11:05

技能介绍

用途 该技能面向正在修改或调试 Hermes Docker 镜像内 s6-overlay 服务监督机制的用户。适用场景包括:向 Hermes Docker 镜像添加或移除一个静态服务(例如 dashboard,需要在每次容器启动时被监督);诊断某个 per-profile gateway 为什么不启动、不重启或无法在 docker restart 后存活;理解容器 CMD 为何是 /opt/hermes/docker/main-wrapper.sh,以及 leading-dash 参数如何到达用户程序;修改 cont-init.d 启动脚本(UID remap、volume seeding、profile reconciliation);修改 per-profile gateway 的渲染 run-script。如果只是想使用 Hermes Agent 的 Docker 功能,应参考 website/docs/user-guide/docker.md。

主要能力与架构 文档说明了镜像内的监督结构:/init 作为 PID 1(s6-overlay v3.2.3.0);cont-init.d 执行仅运行一次的初始化,包括 01-hermes-setup(docker/stage2-hook.sh,负责 UID/GID remap、chown /opt/data、每次启动 chown /opt/data/profiles、播种 .env / config.yaml / SOUL.md、skills_sync.py)和 02-reconcile-profiles(hermes_cli.container_boot,负责把 /run/service 改为 hermes 可写以便运行时注册,并遍历 $HERMES_HOME/profiles/<name>/gateway_state.json,重建 /run/service/gateway-<name>/,仅自动启动 prior_state == "running" 的服务)。s6-rc.d 中的静态服务位于 /etc/s6-overlay/s6-rc.d/,包括 main-hermes/run(exec sleep infinity,占位)和 dashboard/run(当 HERMES_DASHBOARD=1 时运行 hermes dashboard)。/run/service 由 s6-svscan 监视,存放运行时注册的 per-profile gateway。CMD 即主程序 /opt/hermes/docker/main-wrapper.sh,负责路由用户参数。

关键文件 文档列出多个关键文件:Dockerfile(s6-overlay 安装、cont-init.d 连接、ENTRYPOINT)、docker/entrypoint-dispatch.sh(PID-1 调度器,在包装运行时回退)、docker/stage2-hook.sh(旧入口逻辑)、docker/cont-init.d/02-reconcile-profiles、docker/main-wrapper.sh、docker/s6-rc.d/main-hermes/run、docker/s6-rc.d/dashboard/run、docker/entrypoint.sh(向后兼容 shim)、hermes_cli/service_manager.py(S6ServiceManager)、hermes_cli/container_boot.py、hermes_cli/gateway.py 中的 _dispatch_via_service_manager_if_s6。

常见操作 文档给出若干快捷命令:用 docker exec 检查 PID 1;用 /command/s6-svstat 查看某个 gateway 服务状态;用 /command/s6-svc -u/-d/-t 手动启停或重启服务;查看 container-boot.log;新增静态服务的步骤(创建 type、run、dependencies.d/base、user/contents.d/<name>);修改 per-profile gateway run 命令时编辑 S6ServiceManager._render_run_script 并同步测试断言;以及运行 docker 测试框架的命令。

限制与注意事项 文档强调架构 B 的原因:cont-init.d 脚本不接收 CMD 参数,halt 不会传递写入的退出码,容器总是以 143 退出,因此主程序作为 CMD 运行而不受 s6 监督。还列出常见陷阱:docker exec 下 /command/ 不在 PATH,需用绝对路径;profile 目录属主问题;docker exec 写入文件默认 root 属主;服务目录位于 tmpfs,重启后可能被清除;gateway 启动后立即退出通常是 profile 未配置模型或认证;reconciler 以 SOUL.md 是否存在判断真实 profile;容器退出 143 与 s6-svscanctl -t 或 halt 有关。相关技能包括 hermes-agent-dev 和 hermes-tool-quirks。