Skip to content

OpenClaw Docker 部署:容器卷权限错误与 Telegram polling/webhook 模式冲突

问题

使用 Docker Compose 部署 OpenClaw 时,常见两类配置问题:

问题 1:Agent 写文件时遇到权限错误

OpenClaw 的 exec/文件工具运行在 Docker 容器内,映射的宿主机目录(volume)所有者与运行 Docker daemon 的用户不一致,导致:

Error: EACCES: permission denied, open '/workspace/output.txt'

问题 2:Telegram Bot 不响应消息(polling 与 webhook 冲突)

OpenClaw 默认使用 polling 模式从 Telegram 拉取消息,但如果配置文件中误开启了 webhook 选项,两种模式同时存在会导致消息无法正常投递,Bot 完全不响应。

解决方案

修复容器卷权限问题

确保 volume 映射目录的所有者与运行 Docker daemon 的用户一致:

bash
# 查看当前用户
whoami
id

# 修改宿主机目录所有权(替换为实际路径和用户名)
sudo chown -R $(whoami):$(whoami) /path/to/your/workspace

# 或者在 docker-compose.yml 中通过 user 字段指定

docker-compose.yml 中明确声明运行用户:

yaml
services:
  openclaw:
    image: openclaw/openclaw:latest
    user: "1000:1000"   # 替换为 id 命令输出的 uid:gid
    volumes:
      - ./workspace:/workspace

验证修复

bash
docker exec -it openclaw-gateway id
# 应显示与宿主机一致的 uid/gid

修复 Telegram polling/webhook 冲突

检查 OpenClaw 配置文件,确保只启用一种模式:

bash
# 查看 Telegram 相关配置
openclaw config get channels.telegram

正确的 polling 配置(默认,推荐):

yaml
channels:
  telegram:
    botToken: "YOUR_BOT_TOKEN"
    # 不设置 webhookUrl,即使用 polling

如果之前设置过 webhook,需要清除

bash
# 方法一:通过 OpenClaw 配置删除
openclaw config unset channels.telegram.webhookUrl

# 方法二:直接通过 Telegram API 删除 webhook
curl "https://api.telegram.org/bot<YOUR_TOKEN>/deleteWebhook"

# 重启 gateway
openclaw gateway restart

验证 Bot 恢复响应

bash
openclaw logs --follow | grep -i telegram
# 应看到 "polling started" 而非 webhook 相关日志

常见问题

Q: Docker 部署时 agent 创建的文件消失了,是正常的吗?

A: 是的。容器内创建的文件默认在容器生命周期内有效,重启后丢失。需要将工作目录通过 volume 挂载到宿主机,才能持久化输出文件。

Q: 如何确认 Telegram 当前用的是 polling 还是 webhook 模式?

A: 运行 curl "https://api.telegram.org/bot<TOKEN>/getWebhookInfo",返回 url 字段为空字符串表示使用 polling;有 URL 值则表示设置了 webhook。