问题现象
在阿里云服务器上用 Docker 部署 OpenClaw 后,通过飞书给机器人设置定时任务(如每天早上 8 点推送热榜)。到了时间,任务没有执行。
问题原因
| 环境 | 时间 | 时区 |
|---|---|---|
| 宿主机 | 10:52 CST | 北京时间(UTC+8) |
| 容器内 | 02:50 UTC | 世界协调时(UTC+0) |
Docker 容器默认使用 UTC 时间,与宿主机相差 8 小时。当你说“北京时间 8 点执行”时,容器按照 UTC 时间判断——它以为 UTC 0 点就是北京时间 8 点,实际上要等到 UTC 8 点(北京时间 16 点)才执行。
一句话:容器里的时间和外面不是同一个时间。
解决方案
修改 docker-compose.yml,挂载宿主机的时区文件:
services:
openclaw:
volumes:
- /etc/localtime:/etc/localtime:ro # 就这一行
重启容器:
cd /opt/openclaw
docker compose down && docker compose up -d
验证:
docker exec -it openclaw-gateway date
输出北京时间(CST),与宿主机一致。
经验总结
| 教训 | 说明 |
|---|---|
| 容器时间 ≠ 宿主机时间 | Docker 容器默认 UTC,必须手动同步 |
| 定时任务依赖系统时间 | 飞书指令按机器人自己的时间判断 |
| 一行配置省半天排查 | - /etc/localtime:/etc/localtime:ro |
部署容器时顺手加一行配置,定时任务再也不“迟到”。 🕒