我第一次尝试部署 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 输出为例:

用 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(生产环境用)
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 下来改配置用。遇到问题欢迎在评论区留言,我尽量第一时间回复。

👉 免费注册 HolySheep AI,获取首月赠额度