文章目录
- 前言
- 准备
- 镜像制作
-
- 公共部分
- Linux x86 环境
-
- 1、制作镜像文件
- 2、配置 docker-compose 基础信息
- 3、启动镜像
- arm64 环境
-
- 1、定义镜像文件
- 2、打包镜像
- 3、linux x86 配置支持 arm64
- 访问
前言
Docker 镜像制作与各项环境部署。
本篇博客主要介绍Hermes-Agent、Hermes-web-ui、vscode-server和插件 continue汇总,构建镜像。 并在Linux x86和arm64两类环境上部署、使用进行说明。
准备
-
Hermes-web-ui 前端项目 git clone 如果没有网络加速或者梯子,可以考虑在gitee中创建自己的项目,将下面的git地址进行代码同步,然后在国内网络环境进行克隆下载。本次搭建环境使用的版本为 0.6.7。
https://github.com/EKKOLearnAI/hermes-web-ui
https://github.com/EKKOLearnAI/hermes-web-ui.git
-
Docker 环境 与 docker-compose 环境
-
vscode-server 以及 continue 插件。 code-server官网下载安装地址:
https://coder.com/docs/code-server/install#docker
continue插件下载地址:
https://open-vsx.org/?search=continue.continue&sortBy=relevance&sortOrder=desc
-
ubuntu 操作系统服务器
镜像制作
镜像制作时,需要根据实际需要部署的服务器操作系统内核版本来确定,不同的内核需要拉取不同的基础镜像进行处理。 DockerHub网站访问受限,可以从国内的镜像网站中进行查找。
https://docker.aityp.com/s/docker.io
其次Hermes-web-ui的镜像编译比较特别,需要在Hermes-web-ui拉取的代码根目录进行编写。 测试案例环境结构图如下所示 
公共部分
由于Dockerfile中配置镜像,ENTRYPOINT命令只能执行单个指令。本次镜像中包含多个软件的启动。
可以采取定义某个shell脚本,用脚本去调度启动各项服务。
start.sh脚本
set -euo pipefail
# 基础系统环境
export HOME=/home/node
export NODE_ENV=production
export OPENCLAW_CONFIG_DIR=/home/node/.openclaw
export TZ=Asia/Shanghai
export OPENCLAW_GATEWAY_TOKEN=${OC_GW_TOKEN:-}
export OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1
export TERM=xterm-256color
# Web管理端口:compose固定PORT=6060,无默认18789
export PORT=${PORT:-6060}
# Gateway基础配置(与js常量完全统一)
export GATEWAY_HOST=${GATEWAY_HOST:-127.0.0.1}
export GATEWAY_PORT=${GATEWAY_PORT:-18790}
export MANAGER_BASE_PATH=${MANAGER_BASE_PATH:-/manager}
export GATEWAY_START_TIMEOUT_MS=${GATEWAY_START_TIMEOUT_MS:-120000}
export GATEWAY_RESTART_DELAY_MS=${GATEWAY_RESTART_DELAY_MS:-5000}
# Openclaw业务变量
export OPENCLAW_CLI_ENTRY=${OPENCLAW_CLI_ENTRY:-/app/dist/index.js}
# 注入compose内Hermes专属环境变量
export HERMES_ALLOW_ROOT_GATEWAY=${HERMES_ALLOW_ROOT_GATEWAY:-1}
export HERMES_WEB_UI_MANAGED_GATEWAY=${HERMES_WEB_UI_MANAGED_GATEWAY:-1}
export HERMES_DASHBOARD=${HERMES_DASHBOARD:-0}
export GATEWAY_ALLOW_ALL_USERS=${GATEWAY_ALLOW_ALL_USERS:-true}
export PATH=${
PATH:-/opt/hermes/.venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin}
export npm_config_registry=${npm_config_registry:-https://registry.npmmirror.com/}
# 与原 Dockerfile copy 路径一致
exec node /opt/start/scripts/server.js
对应 node.js 执行脚本。
const http = require(\’http\’);
const fs = require(\’fs\’);
const {
spawn } = require(\’child_process\’);
const util = require(\’util\’);
const httpProxy = require(\’http-proxy\’);
// ===================== 【环境配置】=====================
const PORT = Number(process.env.PORT) || 6060;
const MANAGER_BASE_PATH = process.env.MANAGER_BASE_PATH || \’/manager\’;
// Hermes Web UI 配置
const HERMES_BIN = process.env.HERMES_BIN || \’/opt/hermes/.venv/bin/hermes\’;
const HERMES_HOME = process.env.HERMES_HOME || \’/home/agent/.hermes\’;
const HERMES_WEB_UI_MANAGED_GATEWAY = process.env.HERMES_WEB_UI_MANAGED_GATEWAY || \’1\’;
const GATEWAY_HOST = process.env.GATEWAY_HOST || \’127.0.0.1\’;
const GATEWAY_PORT = Number(process.env.GATEWAY_PORT) || 18790;
const GATEWAY_RESTART_DELAY_MS = 5000;
const HERMES_WEB_PORT = Number(process.env.HERMES_WEB_PORT) || 8648;
const HERMES_WEB_UI_HOME = process.env.HERMES_WEB_UI_HOME || \’/home/agent/.hermes-web-ui\’;
let codeServerStarting = false;
let hermesWebUiStarting = false;
const CODE_SERVER_PORT = 19527;
// 日志
const MAX_LOG_LINES = 500;
const logBuffer = [];
const ANSI_PATTERN = /\\x1B\\[[0-?]*[@-~]/g;
function stripAnsi(s) {
return String(s).replace(ANSI_PATTERN, \’\’);
}
function pushLog(type, msg) {
const time = new Date().toISOString().replace(\’T\’, \’ \’).substring(0, 19);
stripAnsi(msg).split(\’\\n\’).forEach(line => {
const trim = line.trim();
if (trim) logBuffer.push(`[${
time}] [
