docker service_Hermes 容器重启插件丢失解决方法_Hermes docker 部署 npm 包 持久化存储

很多使用 docker 部署 Hermes 的小伙伴,都会发现一个现象,明明之前安装过的插件、工具,怎么转眼 Hermes 就忘记了。

明明前面文字里还提到它,现在让它去找,它怎么都找不到,还反过来让你给它提供信息,笨的要死。

docker service_Hermes 容器重启插件丢失解决方法_Hermes docker 部署 npm 包 持久化存储

比如我刚刚让它安装了一个飞书 CLI,完整完成之后重启了一下容器。

Hermes docker 部署 npm 包 持久化存储_Hermes 容器重启插件丢失解决方法_docker service

好家伙,这个 feishu cli 直接找不到了。容器路径里找不到,指令找不到,甚至在安装记录里都找不到。

Hermes 容器重启插件丢失解决方法_Hermes docker 部署 npm 包 持久化存储_docker service

Hermes docker 部署 npm 包 持久化存储_docker service_Hermes 容器重启插件丢失解决方法

因为答案很简单,不是它变笨了,而是 Hermes 丢了环境变量。npm 包,是目前通用型 Agent 最主流的插件、工具包安装指令之一,之前很多未集成到官方服务内的工具都是以 npm 工具包的形式存在,比如之前的微信。

而在 Hermes 的官方 yaml 文件中,默认默认只对 /opt/data(~/.hermes),即 Hermes 的自身数据进行持久化存储。而 apt、npm、pip 等常用的软件包配置路径和工具,Hermes 是一个也不保存的。

所以 npm 包的丢失,原因是因为我们没有做容器的持久化存储,这是 docker 的特性docker service,重启后会初始化容器内的一切数据,并且重新挂载映射的文件夹、容器卷。

在极空间的 Hermes 应用中,也可以看到仅有 /opt/data 映射,与官方一致。

docker service_Hermes docker 部署 npm 包 持久化存储_Hermes 容器重启插件丢失解决方法

那么如何解决呢?有两种方案:

1️⃣ 改变工具包路径

Hermes docker 部署 npm 包 持久化存储_docker service_Hermes 容器重启插件丢失解决方法

以 npm 为例linux操作系统好吗,默认 prefix 是 ~/.local,这是一个不持久化存储的路径,所以任何安装进去的工具,都会在 docker 重启后被清空。

因此我们要做的是docker service,就是将 prefix 设置到 $HOME 路径。在 Hermes 中,容器化部署的时候会传入 HERMES_HOME 这个环境变量来作为容器内的 $HOME。

所以聪明的大模型,会在安装完 npm 工具后,提醒用户配置 bashrc 里的 PATH 参数,或者自动执行,同时将 bashrc 持久化。但是笨的模型么,那就呵呵哒了。

很多人觉得自己没遇到过这个问题,原因是你的模型某几次安装的时候聪明了,帮你解决了这个坑。

Hermes 容器重启插件丢失解决方法_docker service_Hermes docker 部署 npm 包 持久化存储

2️⃣ 持久化存储容器根目录

有人会说了,那我是不是直接把 /root/usr/.config 等等路径都映射到容器外,就能确保安装不丢失?

没错,力大飞砖出奇迹。你可以在 Hermes 的 docker volume 里,增加 docker volume 对应的容器内路径来解决。

但是这种方法会增加整个容器系统存储到 NAS 里,虽然可能只有几十G,但是时间久了难免占用过多空间。

两种方案里,我更倾向的是第一种,因此我基于 Hermes 的官方 Hooks 渠道,做了一个 hookubuntu linux,将依靠模型的不确定性路径持久化,变为安全可靠的路径持久化。

Hermes Hooks 采用 0 侵入式修复,可以在网关启动的时候同步完成 PATH 路径重新映射到 /opt/data/(home) ,跟随容器的 /opt/data 长期存储,所以安装的 NPM 包都不会丢失。

只要 Hooks 机制不变,永远可以迁移存储,和 Hermes 版本升级无关。我把这个 hook 分享出来,直接放到 Hermes 的项目根目录下的 Hooks 文件夹下就行了。

夸氪 /s/3635877615f0

docker service_Hermes 容器重启插件丢失解决方法_Hermes docker 部署 npm 包 持久化存储

重新启动容器之前,告诉 Hermes 查看一下 Hooks 下的文件,让它帮你迁移一下服务和现有的工具包。

docker service_Hermes docker 部署 npm 包 持久化存储_Hermes 容器重启插件丢失解决方法

接着重启容器,可以看到新的持久化路径被写入 $HOME 下的 /.profile/.bashrc 两个文件里。

docker service_Hermes docker 部署 npm 包 持久化存储_Hermes 容器重启插件丢失解决方法

这个时候你再去问 Hermes 之前安装过的 NPM 工具,它都可以回答上来。至此,你将拥有一个永远不会因重启容器而变蠢的 Hermes-Agent。

Hermes docker 部署 npm 包 持久化存储_Hermes 容器重启插件丢失解决方法_docker service

在极空间的持久化路径里,你可以看到安装过的工具包。

docker service_Hermes 容器重启插件丢失解决方法_Hermes docker 部署 npm 包 持久化存储

如果,你是在其它 Hermes 里使用,而且自己更改了 HERMES_HOME 这个环境变量的,那么可以在 hooks 下的 py 脚本里修改 DATA_DIR 和 HOME_DIR 为容器内的实际路径。

docker service_Hermes docker 部署 npm 包 持久化存储_Hermes 容器重启插件丢失解决方法

好消息是,如果你已经更新了极空间应用中心的 Hermes-Agent,那么这个插件已经被内置在软件里了,无需配置即可启用。

HOOKS 可能是大家使用通用型 Agent 时候经常忽略的一个机制,它虽然不如 skill、plugin 那么常用,但是它的机制是独一无二的,而且更稳定。

可以在 Agent 启动前、会话启动前通过提示词、配置的方式修改 Agent 的参数,甚至改变 Agent 的行为习惯。只需要符合 Hermes 对 Hooks 的定义即可。

Hermes docker 部署 npm 包 持久化存储_Hermes 容器重启插件丢失解决方法_docker service

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

#上头条 聊热点#

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复