阅读时间 6 分钟

Hermes Agent Docker 容器化运行完全指南

来源说明:本文关于 Hermes Agent Docker 使用指南的核心内容引用自 NousResearch 官方文档 Hermes Agent — Docker,并结合作者对容器化与宿主机运行差异的分析,以及针对子命令执行和 Profiles 使用的实践解读。

两种 Docker 交互方式

Hermes Agent 与 Docker 的交互存在两种不同模式,官方文档对此有明确区分:

  • 在 Docker 中运行 Hermes(本文重点):Agent 本身运行在容器内部,所有用户数据通过挂载卷持久化到宿主机。
  • Docker 作为终端后端:Agent 运行在宿主机,但具体命令执行在 Docker 沙箱中完成。该模式需通过 terminal.backend 配置启用。

以下讨论均围绕第一种模式展开。

快速开始:三种运行方式

1. 首次初始化(setup 向导)

mkdir -p ~/.hermes
docker run -it --rm \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent setup

该命令启动交互式安装向导,将 API 密钥写入 ~/.hermes/.env。此步骤只需执行一次。

2. Gateway 模式(后台常驻)

docker run -d \
  --name hermes \
  --restart unless-stopped \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent gateway run

适用于 Telegram、Discord、Slack、WhatsApp 等消息平台的长期接入。

3. 交互式 CLI 模式

docker run -it --rm \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent

用于临时开启一个聊天会话。

持久化数据目录结构

容器内 /opt/data 映射到宿主机 ~/.hermes/,是 Hermes 所有状态的单一真相源,包含:

路径 内容
.env API 密钥与秘密
config.yaml 所有 Hermes 配置
SOUL.md Agent 人格/身份定义
sessions/ 对话历史
memories/ 持久化记忆
skills/ 已安装技能
cron/ 定时任务定义
hooks/ 事件钩子
logs/ 运行时日志
skins/ 自定义 CLI 皮肤
官方警告:切勿用同一个数据目录同时运行两个 Hermes 容器。会话文件和内存存储未设计为并发安全。

容器化运行 vs 宿主机直接运行

容器化的主要优势

优势 说明
环境一致性 官方镜像已预装 Python、Node.js、Playwright + Chromium、ripgrep、ffmpeg、WhatsApp bridge 等全部依赖,宿主机运行则需手动配置虚拟环境与浏览器。
依赖隔离 Hermes 的 Node 版本、Playwright 浏览器二进制等不会与宿主机其他项目冲突。
无状态升级 镜像本身无状态,所有数据保存在挂载目录。升级时只需 docker pull 新镜像即可,不丢失配置。
资源可控 可通过 --memory--cpus 明确限制容器资源,防止浏览器自动化或长任务耗尽宿主机资源。
可移植性 备份 ~/.hermes 目录后,可在任意机器上通过相同挂载命令快速恢复完整环境。
适合长期驻留 docker run -d --restart unless-stopped 非常适合将 Hermes 作为后台 Gateway 服务运行。

容器化的主要劣势

劣势 说明
并发限制 官方文档明确禁止两个容器同时挂载同一数据目录。宿主机单进程运行天然不存在此问题。
权限问题 容器默认以 root 启动,写入 ~/.hermes 的文件在宿主机可能归属 root,导致后续宿主机直接运行时遇到权限错误。
浏览器工具需额外配置 Playwright/Chromium 在容器内需要共享内存,必须添加 --shm-size=1g,否则可能崩溃。
镜像体积较大 基于 Debian 且包含完整浏览器引擎,镜像比纯 Python 环境大得多。
调试多一层 查看日志、修改代码、运行测试均需通过 docker execdocker logs 操作,不如宿主机开发直接。
排查成本 .env 缺失或配置错误,容器会立即退出,新手需要查看 docker logs 才能定位;宿主机交互运行则能直接看到报错输出。

选择建议

  • 优先选 Docker:追求开箱即用、快速部署、长期后台运行 Gateway,或宿主机环境复杂不愿手动配置依赖的场景。
  • 优先选宿主机:需要频繁开发调试、对文件权限敏感、重度使用浏览器自动化且希望最小化资源开销的场景。

若计划混用(Docker 跑 Gateway + 宿主机 CLI 调试),需特别注意容器生成的文件权限问题。

两个关键实践问题

1. Gateway 前台运行时如何执行其他子命令?

容器启动命令 hermes gateway run 为前台进程。执行其他子命令有两种方式:

方式 A:对运行中的容器执行 docker exec(推荐)


# 查看日志
docker exec hermes hermes logs

# 运行 setup 向导
docker exec -it hermes hermes setup

# 查看版本或 insights
docker exec hermes hermes version
docker exec hermes hermes insights

方式 B:启动一次性临时容器

docker run -it --rm \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent setup
注意:若 Gateway 容器已在运行,不要同时启动另一个挂载同一 ~/.hermes 的容器执行命令,否则会造成并发冲突。优先使用 docker exec

2. 容器化环境下 Profiles 是否可用?

可用,但需要显式指定 HERMES_HOME 环境变量。

hermes_constants.py 源码可以看出,Hermes 已明确处理 Docker 场景下的 profile 路径识别:当 HERMES_HOME 指向 <root>/profiles/<name> 时,系统能正确解析其根目录。

使用示例


# 以 coder profile 运行 Gateway
docker run -d \
  --name hermes-coder \
  -v ~/.hermes:/opt/data \
  -e HERMES_HOME=/opt/data/profiles/coder \
  nousresearch/hermes-agent gateway run

# 对该 profile 执行交互式 CLI
docker run -it --rm \
  -v ~/.hermes:/opt/data \
  -e HERMES_HOME=/opt/data/profiles/coder \
  nousresearch/hermes-agent

只要 -v ~/.hermes:/opt/data 挂载正确,profile 数据就会在宿主机持久化。entrypoint.sh 还会自动创建 home/ 子目录,使 git、ssh、npm 等子进程的配置也能落入持久卷中。

若未显式指定 HERMES_HOME,则默认使用 /opt/data,等价于宿主机直接运行 hermes(不带 -p 参数)的默认 profile 模式。

总结

Hermes Agent 的 Docker 容器化部署通过单一挂载卷实现了配置与镜像的解耦,既保留了无状态升级的优势,又确保了数据的持久化。对于希望将 Hermes 作为长期后台 Gateway 的用户,Docker 是最省心的方案。

但在实际使用中需要注意三点:

  1. 严禁同一数据目录并发挂载多个容器
  2. 子命令优先通过 docker exec 执行,避免启动冲突容器;
  3. Profiles 在 Docker 中完全支持,核心操作是通过 -e HERMES_HOME=/opt/data/profiles/<name> 显式指定路径。

如果你还在宿主机与容器化之间犹豫,可以先通过 Docker 完成 setup 向导并试用 Gateway 模式,确认稳定后再决定是否长期采用。