在 docker 容器内的配置文件目录在是:Config overwrite: /root/.openclaw/openclaw.json

docker的 dockerfile 配置挂载目录有问题,现在的问题是.openclaw配置在:/home/node/.openclaw
实际上的容器内.openclaw配置路径是:/root/.openclaw

详细步骤

步骤 1:创建构建目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建构建目录
mkdir -p /home/ubuntu/docker-build
cd /home/ubuntu/docker-build

# 复制 OpenClaw 源码
cp -r /home/ubuntu/openclaw/* .

# 创建 openclaw-defaults 目录(存放默认配置)
mkdir -p openclaw-defaults

# 复制自定义插件
cp -r /home/ubuntu/.openclaw/extensions openclaw-defaults/

# 复制工作空间配置
cp -r /home/ubuntu/.openclaw/workspace openclaw-defaults/

# 复制定时任务配置
cp -r /home/ubuntu/.openclaw/cron openclaw-defaults/

# 复制 canvas 配置(如果有自定义)
cp -r /home/ubuntu/.openclaw/canvas openclaw-defaults/

步骤 2:创建初始化脚本 init-openclaw.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
# /home/ubuntu/docker-build/init-openclaw.sh
# OpenClaw 容器初始化脚本 - 仅包含 Metis 插件

set -e

# 容器内实际使用的配置路径
OPENCLAW_HOME="/root/.openclaw"
# 镜像内预置的默认配置
DEFAULTS_DIR="/opt/openclaw-defaults"

echo "[init-openclaw] Starting initialization..."
echo "[init-openclaw] OPENCLAW_HOME: $OPENCLAW_HOME"

# 确保 .openclaw 目录存在
mkdir -p "$OPENCLAW_HOME"

# ========================================
# 复制 Metis 插件(如果目标不存在)
# ========================================
if [ -d "$DEFAULTS_DIR/extensions/metis" ]; then
mkdir -p "$OPENCLAW_HOME/extensions"

if [ ! -d "$OPENCLAW_HOME/extensions/metis" ]; then
echo "[init-openclaw] Copying Metis plugin..."
cp -r "$DEFAULTS_DIR/extensions/metis" "$OPENCLAW_HOME/extensions/"
echo "[init-openclaw] Metis plugin copied successfully."
else
echo "[init-openclaw] Metis plugin already exists, skipping..."
fi
else
echo "[init-openclaw] Warning: Default Metis plugin not found at $DEFAULTS_DIR/extensions/metis"
fi

# ========================================
# 创建运行时目录
# ========================================
mkdir -p "$OPENCLAW_HOME/agents"
mkdir -p "$OPENCLAW_HOME/logs"
mkdir -p "$OPENCLAW_HOME/delivery-queue"
mkdir -p "$OPENCLAW_HOME/devices"
mkdir -p "$OPENCLAW_HOME/completions"
mkdir -p "$OPENCLAW_HOME/memory"

echo "[init-openclaw] Initialization complete, starting OpenClaw..."

# 执行传入的命令(默认是启动 gateway)
exec "$@"

步骤 3:创建 Dockerfile.custom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# /home/ubuntu/docker-build/Dockerfile.custom
# OpenClaw 自定义镜像 - 包含 Metis 插件

FROM node:22-bookworm@sha256:cd7bcd2e7a1e6f72052feb023c7f6b722205d3fcab7bbcbd2d1bfdab10b1e935

# 镜像元数据
LABEL org.opencontainers.image.title="OpenClaw-Custom" \
org.opencontainers.image.description="OpenClaw gateway with Metis plugin" \
org.opencontainers.image.version="2026.3.2-custom"

# 安装必要工具
RUN apt-get update && \
apt-get install -y --no-install-recommends gosu net-tools && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

# 强制使用 pnpm 进行构建(替代 Bun)
ENV OPENCLAW_PREFER_PNPM=1

RUN corepack enable

WORKDIR /app
RUN chown node:node /app

# ========================================
# 构建 OpenClaw 核心
# ========================================
COPY --chown=node:node package.json pnpm-lock.yaml pnpm-workspace.yaml ./
# 创建 .npmrc
RUN echo "# pnpm build-script allowlist lives in package.json -> pnpm.onlyBuiltDependencies." > .npmrc && chown node:node .npmrc
COPY --chown=node:node ui/package.json ./ui/package.json
COPY --chown=node:node patches ./patches
COPY --chown=node:node scripts ./scripts

USER node
RUN NODE_OPTIONS=--max-old-space-size=2048 pnpm install --frozen-lockfile

USER root
USER node
COPY --chown=node:node . .

# 移除不需要的默认配置目录
RUN rm -rf /app/openclaw-defaults || true

# 规范化权限
RUN for dir in /app/extensions /app/.agent /app/.agents; do \
if [ -d "$dir" ]; then \
find "$dir" -type d -exec chmod 755 {} +; \
find "$dir" -type f -exec chmod 644 {} +; \
fi; \
done

RUN pnpm build
RUN pnpm ui:build

# ========================================
# 复制 Metis 插件到默认位置
# ========================================
USER root

# 创建默认插件目录(用于首次启动时复制)
RUN mkdir -p /opt/openclaw-defaults/extensions

# 复制 metis 插件到默认位置
COPY openclaw-defaults/extensions/metis/ /opt/openclaw-defaults/extensions/metis/

# 设置权限
RUN chmod -R 755 /opt/openclaw-defaults

# ========================================
# 复制初始化脚本
# ========================================
COPY --chmod=755 init-openclaw.sh /usr/local/bin/init-openclaw.sh

# CLI 链接
RUN ln -sf /app/openclaw.mjs /usr/local/bin/openclaw && \
chmod 755 /app/openclaw.mjs

ENV NODE_ENV=production

# 健康检查
HEALTHCHECK --interval=3m --timeout=10s --start-period=15s --retries=3 \
CMD node -e "fetch('http://127.0.0.1:18789/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"

# 使用初始化脚本作为入口点
ENTRYPOINT ["/usr/local/bin/init-openclaw.sh"]
CMD ["node", "openclaw.mjs", "gateway", "--bind", "lan", "--allow-unconfigured"]

步骤 4:构建 Docker 镜像

1
2
3
4
5
6
7
cd /home/ubuntu/docker-build

# 构建镜像
docker build -f Dockerfile.custom -t openclaw-custom:2026.3.2 .

# 打上 latest 标签
docker tag openclaw-custom:2026.3.2 openclaw-custom:latest
  • 步骤 5:测试镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建测试用的数据目录
mkdir -p /tmp/openclaw-test

# 运行测试(挂载空目录,验证初始化脚本是否正确复制默认配置)
docker run --rm -it \
-p 18789:18789 \
-v /tmp/openclaw-test:/home/node/.openclaw \
-e OPENCLAW_GATEWAY_BIND=lan \
openclaw-custom:latest

# 检查是否正确初始化
ls -la /tmp/openclaw-test/
ls -la /tmp/openclaw-test/extensions/
ls -la /tmp/openclaw-test/workspace/

步骤 5:推送到腾讯云 TCR

1
2
3
4
5
6
7
8
9
10
# 登录腾讯云 TCR
docker login ccr.ccs.tencentyun.com --username=<你的腾讯云账号ID>

# 打标签
docker tag openclaw-custom:2026.3.2 ccr.ccs.tencentyun.com/<命名空间>/openclaw:2026.3.2
docker tag openclaw-custom:2026.3.2 ccr.ccs.tencentyun.com/<命名空间>/openclaw:latest

# 推送
docker push ccr.ccs.tencentyun.com/<命名空间>/openclaw:2026.3.2
docker push ccr.ccs.tencentyun.com/<命名空间>/openclaw:latest

docker 内部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 后台挂载
nohup openclaw gateway > /tmp/openclaw.log 2>&1 &

# 新的创建方式
docker run -it \
-p 18889:18789 \
-p 8888:8888 \
-v /home/ubuntu/docker_config/test1:/root/.openclaw \
-e OPENCLAW_GATEWAY_BIND=lan \
openclaw-custom:latest-fix bash

# 更新的创建方式
docker run -d \
-p 18889:18789 \
-p 8888:8888 \
-v /home/ubuntu/docker_config/test1:/root/.openclaw \
-e OPENCLAW_GATEWAY_BIND=lan \
openclaw-custom:latest-fix