
Odoo 在 Docker 中因 filestore 目录未持久化或路径不匹配,导致静态资源(如 CSS/JS)加载时抛出 FileNotFoundError,核心原因是 /var/lib/odoo/filestore 未正确挂载为卷。
odoo 在 docker 中因 `filestore` 目录未持久化或路径不匹配,导致静态资源(如 css/js)加载时抛出 `filenotfounderror`,核心原因是 `/var/lib/odoo/filestore` 未正确挂载为卷。
该错误本质是 Odoo 的附件系统(ir.attachment)在尝试通过 _to_http_stream() 提供前端资产(如 /web/assets/...)时,无法在预期路径(例如 /var/lib/odoo/filestore/odoo2/7b/7b55d31b...)找到对应文件——因为该路径属于内存临时目录或未持久化的容器层,容器重启后文件即丢失。
✅ 正确做法:将 filestore 显式声明为命名卷
你的 docker-compose.yml 当前将配置、自定义模块等路径做了挂载,但 遗漏了最关键的 data_dir 持久化。/var/lib/odoo 不仅包含日志和 session 数据,更核心的是其子目录 filestore/ ——所有二进制附件(包括 Web 资产哈希文件)均存放于此。若未挂载,每次容器重建都会清空该目录,而数据库仍保留附件元数据(ir_attachment 记录),从而引发“记录存在但文件丢失”的经典 500 错误。
请按以下方式修正 docker-compose.yml:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
version: '3.8'
services:
postgres:
image: postgres:15
container_name: odoo-postgres
environment:
POSTGRES_USER: odoo3
POSTGRES_PASSWORD: odoo
POSTGRES_DB: odoo
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app_network
odoo:
image: odoo:18.0
container_name: odoo-app
depends_on:
- postgres
environment:
HOST: postgres
USER: odoo3
PASSWORD: odoo
PORT: 5432
DB: odoo
ports:
- "8069:8069"
volumes:
- ./odoo/odoo.conf:/etc/odoo/odoo.conf
- ./odoo/addons:/mnt/addons
- ./odoo/custom_addons:/mnt/custom_addons
- odoo_data:/var/lib/odoo # ✅ 关键修复:持久化整个 data_dir
networks:
- app_network
nextjs:
build:
context: ./form
dockerfile: Dockerfile
container_name: nextjs-app
ports:
- "3000:3000"
volumes:
- ./form:/app
networks:
- app_network
volumes:
postgres_data:
odoo_data: # ✅ 新增命名卷,确保 filestore 持久化
networks:
app_network:
? 为什么必须用命名卷而非绑定挂载?
odoo_data 命名卷由 Docker 管理,自动处理权限、跨平台兼容性及容器间数据一致性;而 ./odoo/data 这类绑定挂载易因宿主机权限(如 UID/GID 不匹配)、路径不存在或 SELinux 限制引发新问题。
? 补充验证与恢复步骤
若已存在历史数据且 filestore 文件散落在其他位置(如本地开发残留的 ~/.local/share/Odoo/filestore 或旧容器中),可执行以下操作恢复:
# 1. 查找原始 filestore(例如在宿主机用户目录下) find ~ -path "*/Odoo/filestore" -type d 2>/dev/null | head -1 # 2. 将其内容复制到命名卷(需先启动容器获取卷路径) docker run --rm -v odoo_data:/target -v /host/path/to/filestore:/source alpine cp -r /source/. /target/ # 3. 重启服务 docker compose down && docker compose up -d
⚠️ 注意事项
- 切勿手动修改 filestore 内部文件结构:Odoo 使用 SHA-1 哈希分层(如 7b/7b55d31b...),直接移动文件可能破坏校验。
- odoo.conf 中 data_dir = /var/lib/odoo 无需更改:只要挂载目标一致,Odoo 自动使用该路径。
- 首次启动后检查权限:Docker 官方 Odoo 镜像以 odoo 用户(UID 101)运行,命名卷默认权限兼容;若使用绑定挂载,需确保宿主机目录属主为 101:101。
- 升级镜像版本时:odoo_data 卷可复用,但建议备份数据库并测试兼容性。
完成上述配置后,FileNotFoundError 将彻底消失,Web 资产(CSS/JS)及所有附件均可正常加载。这是 Odoo Docker 化部署中最常见也最关键的持久化实践之一。










