我第一次尝试部署 hermes-agent 时,在 Docker 环境里折腾了整整三天。镜像拉取失败、依赖冲突、端口占用、API 连接超时……几乎把所有新手能犯的错误都踩了一遍。今天我把完整的避坑经验整理出来,手把手带大家从零完成部署。
一、为什么选择 Docker 部署 hermes-agent?
hermes-agent 是一个强大的 AI 代理框架,支持多模型调度、任务编排和工具调用。但它的依赖环境比较复杂,直接在主机安装容易和现有环境冲突。Docker 容器化部署有三个明显优势:环境隔离避免污染、一键部署随时迁移、资源可控便于监控。
对于国内开发者来说,还有一个现实问题:很多 AI API 在海外服务器,延迟高还不稳定。我后来换成 HolySheep AI 的 API,国内直连延迟在 50ms 以内,调试效率提升了好几倍。
二、前置准备:安装 Docker 和获取 API Key
2.1 Docker 安装(Windows/Mac/Linux 全平台)
打开 Docker 官网下载 Docker Desktop,安装完成后在终端验证:
docker --version
正常输出类似:Docker version 24.0.7, build afdd53b
docker-compose --version
正常输出类似:Docker Compose version v2.23.0
如果看到“command not found”,说明 Docker 没装好或者没添加到环境变量。Windows 用户建议重启电脑后重试。
2.2 获取 HolySheep AI API Key
我推荐大家使用 HolySheep AI,原因很简单:汇率相当于 ¥1=$1,官方标注是 ¥7.3=$1,实际用下来确实能节省 85% 以上的成本。微信、支付宝直接充值,没有信用卡也能玩转。
注册完成后,在控制台创建 API Key,格式类似 hs-xxxxxxxxxxxxxxxxxxxxxxxx,复制保存好,后面要用到。
三、创建 hermes-agent 项目结构
我建议新建一个专门的项目文件夹,结构如下:
hermes-agent-project/
├── docker-compose.yml
├── Dockerfile
├── .env
├── config/
│ └── agent_config.yaml
└── src/
└── main.py
这样结构清晰,后面排查问题也好定位。手动创建这些文件夹和文件,或者在终端执行:
mkdir -p hermes-agent-project/{config,src}
cd hermes-agent-project
touch docker-compose.yml Dockerfile .env config/agent_config.yaml src/main.py
四、编写核心配置文件
4.1 .env 环境变量文件
这是最容易出错的地方!我一开始把 API Key 写错了一个字符,排查了半天才发现。强烈建议用复制粘贴,不要手动输入。
# HolySheep AI 配置
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
模型配置(根据预算选择)
DEFAULT_MODEL=gpt-4.1
FALLBACK_MODEL=deepseek-v3.2
Docker 容器配置
LOG_LEVEL=INFO
WORKERS=4
PORT=8000
4.2 docker-compose.yml 编排文件
这是整个部署的核心文件。我踩过的坑是端口映射写错、网络模式没配置、 volume 挂载路径不对。下面是经过验证可用的配置:
version: '3.8'
services:
hermes-agent:
build:
context: .
dockerfile: Dockerfile
container_name: hermes-agent-server
restart: unless-stopped
ports:
- "8000:8000"
environment:
- HOLYSHEEP_API_KEY=${HOLYSHEEP_API_KEY}
- HOLYSHEEP_BASE_URL=${HOLYSHEEP_BASE_URL}
- DEFAULT_MODEL=${DEFAULT_MODEL}
- LOG_LEVEL=${LOG_LEVEL}
volumes:
- ./config:/app/config
- ./logs:/app/logs
networks:
- hermes-net
networks:
hermes-net:
driver: bridge
4.3 Dockerfile 构建文件
很多新手在这里卡住,镜像拉不下来或者依赖装不上。我用的是 Python 3.11 基础镜像,兼容性比较好。
FROM python:3.11-slim
设置工作目录
WORKDIR /app
安装系统依赖(很多人漏掉这步!)
RUN apt-get update && apt-get install -y \
gcc \
g++ \
curl \
&& rm -rf /var/lib/apt/lists/*
复制依赖文件
COPY requirements.txt .
安装 Python 依赖(使用国内镜像加速)
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
pip install --no-cache-dir -r requirements.txt
复制源代码
COPY src/ ./src/
COPY config/ ./config/
暴露端口
EXPOSE 8000
启动命令
CMD ["python", "src/main.py"]
4.4 requirements.txt 依赖清单
fastapi==0.109.0
uvicorn==0.27.0
httpx==0.26.0
pydantic==2.5.3
python-dotenv==1.0.0
pyyaml==6.0.1
4.5 核心代码 src/main.py
这是一个最简可用的 hermes-agent 示例,连接 HolySheep API 实现对话功能:
import os
import httpx
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from dotenv import load_dotenv
load_dotenv()
app = FastAPI(title="Hermes Agent API")
API_KEY = os.getenv("HOLYSHEEP_API_KEY")
BASE_URL = os.getenv("HOLYSHEEP_BASE_URL")
DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "gpt-4.1")
class ChatRequest(BaseModel):
message: str
model: str = None
class ChatResponse(BaseModel):
reply: str
model: str
tokens_used: int
@app.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest):
model = request.model or DEFAULT_MODEL
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": [{"role": "user", "content": request.message}],
"max_tokens": 1000
}
async with httpx.AsyncClient(timeout=30.0) as client:
try:
response = await client.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload
)
response.raise_for_status()
data = response.json()
return ChatResponse(
reply=data["choices"][0]["message"]["content"],
model=data["model"],
tokens_used=data["usage"]["total_tokens"]
)
except httpx.HTTPStatusError as e:
raise HTTPException(status_code=e.response.status_code, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=f"API调用失败: {str(e)}")
@app.get("/health")
async def health_check():
return {"status": "healthy", "provider": "HolySheep AI"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
五、启动 Docker 容器(避坑详解)
5.1 构建镜像
在项目根目录执行构建命令:
docker-compose build
第一次构建会比较慢,需要拉取基础镜像和安装依赖。如果看到“Failed to fetch”之类的错误,大概率是网络问题,加一下 Docker 镜像加速器:
# 编辑 ~/.docker/daemon.json(Mac 是 ~/Library/Containers/com.docker.docker/)
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
改完后重启 Docker Desktop,再用 docker-compose build 重试。
5.2 启动服务
docker-compose up -d
用 docker-compose logs -f 查看实时日志,确认有没有报错。健康检查通过后,API 就运行起来了。
5.3 验证部署
# 检查容器状态
docker ps
测试健康接口
curl http://localhost:8000/health
测试实际对话(需要填写你的问题)
curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-d '{"message": "你好,请介绍一下 hermes-agent"}'
正常情况下会返回 JSON 格式的回复。我第一次跑通的时候,延迟大概在 80ms 左右,比之前用海外 API 的 300ms+ 快多了。
六、HolySheep API 价格对比(省钱实测)
我专门做了个对比表,以一个月用 100 万 tokens 输出为例:
- GPT-4.1:$8/MTok × 100 = $800(≈ ¥5840)
- Claude Sonnet 4.5:$15/MTok × 100 = $1500(≈ ¥10950)
- Gemini 2.5 Flash:$2.50/MTok × 100 = $250(≈ ¥1825)
- DeepSeek V3.2:$0.42/MTok × 100 = $42(≈ ¥307)
用 HolySheep 的 ¥1=$1 汇率,DeepSeek 成本只有 307 元人民币,对个人开发者非常友好。而且 HolySheep 支持微信/支付宝充值,即时到账,不需要折腾信用卡。
常见报错排查
错误1:docker-compose up 报 "Error response from daemon: driver failed programming external connectivity"
这是端口冲突最常见的错误。我的解决步骤:
# 1. 查看端口占用情况
netstat -ano | findstr :8000 # Windows
lsof -i :8000 # Mac/Linux
2. 如果有进程占用,kill 掉
Windows: taskkill /PID <进程ID> /F
Mac/Linux: kill -9 <进程ID>
3. 或者直接改 docker-compose.yml 的端口映射
ports:
- "8888:8000" # 改成其他端口
错误2:API 返回 401 Unauthorized
这个问题我遇到过三次,都是因为 API Key 配置错误:
# 检查 .env 文件是否正确加载
1. 确认没有多余的空格或引号
HOLYSHEEP_API_KEY=hs-xxxxxxxxxxxxxxxx # 不要加引号!
2. 验证环境变量是否传入容器
docker exec hermes-agent-server env | grep HOLYSHEEP
3. 如果 Key 失效,去控制台重新生成一个
https://www.holysheep.ai/console/api-keys
错误3:httpx.ConnectTimeout 连接超时
海外 API 超时很常见,换成国内节点就能解决。我后来全面切换到 HolySheep AI,国内直连延迟稳定在 50ms 以内,基本没再出现过超时:
# .env 文件中使用 HolySheep 国内节点
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
如果一定要用其他 API,可以增加超时时间
async with httpx.AsyncClient(timeout=60.0) as client: # 改成60秒
错误4:依赖安装失败 "Could not find a version that satisfies the requirement"
一般是 Python 版本不兼容或者源有问题:
# 1. 检查 Python 版本
python --version # 需要 3.9 以上
2. 切换 pip 源(Dockerfile 里已经配置了清华源)
如果手动安装:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
3. 更新 requirements.txt 里的版本号
访问 https://pypi.org/ 查最新版本
错误5:容器启动后立即退出 "Exited (0)"
这种情况通常是启动命令有问题:
# 1. 查看容器日志
docker logs hermes-agent-server
2. 交互式进入容器调试
docker run -it hermes-agent-project bash
3. 手动执行启动命令看报错
cd /app && python src/main.py
七、生产环境优化建议
跑通 Demo 之后,我总结了几个生产环境必做的优化:
- 健康检查:在 docker-compose.yml 里加 healthcheck 配置
- 资源限制:设置 mem_limit 和 cpu_share,防止资源耗尽
- 日志轮转:配置 log-driver 为 json-file 并设置 max-size
- 多模型降级:配置 fallback 策略,主模型不可用时自动切换
- 密钥管理:生产环境用 Docker secrets 或 Vault,不要放 .env 文件
# 增强版 docker-compose.yml(生产环境用)
services:
hermes-agent:
# ... 其他配置 ...
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
八、总结
部署 hermes-agent 的核心难点在于环境隔离和依赖管理,Docker 完美解决了这个问题。整个流程总结下来就是:装 Docker → 配环境变量 → 写配置文件 → 构建镜像 → 启动容器。遇到问题不要慌,先看日志,80% 的错误都能从日志里找到原因。
选对 API 服务商也很重要。我最开始用海外 API,延迟高不说,账单也吓人。换成 HolySheep AI 之后,¥1=$1 的汇率和国内 50ms 以内的延迟,调试效率提升明显,而且支持微信支付宝,对国内开发者非常友好。
完整代码已经整理好,大家可以直接 Clone 下来改配置用。遇到问题欢迎在评论区留言,我尽量第一时间回复。