You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Odoo16模块内写入操作触发Permission Error求助

Docker部署Odoo16自定义模块写入权限问题解决

问题背景

用Docker部署Odoo16,自定义模块需要在自身目录创建文件夹、生成zip文件并写入用户上传内容,但执行os.mkdir、shutil.make_archive等写入操作时触发权限错误。手动创建目录能绕过mkdir问题,但写入zip文件仍失败,容器已开启privileged模式,想明确权限问题根源并解决。

报错信息(中文翻译)

回溯(最近的调用最后):
  文件 "/usr/lib/python3/dist-packages/odoo/http.py", 第1583行, 在 _serve_db中
    return service_model.retrying(self._serve_ir_http, self.env)
  文件 "/usr/lib/python3/dist-packages/odoo/service/model.py", 第134行, 在 retrying中
    result = func()
  文件 "/usr/lib/python3/dist-packages/odoo/http.py", 第1612行, 在 _serve_ir_http中
    response = self.dispatcher.dispatch(rule.endpoint, args)
  文件 "/usr/lib/python3/dist-packages/odoo/http.py", 第1810行, 在 dispatch中
    result = self.request.registry['ir.http']._dispatch(endpoint)
  文件 "/usr/lib/python3/dist-packages/odoo/addons/website/models/ir_http.py", 第235行, 在 _dispatch中
    response = super()._dispatch(endpoint)
  文件 "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", 第149行, 在 _dispatch中
    result = endpoint(**request.params)
  文件 "/usr/lib/python3/dist-packages/odoo/http.py", 第698行, 在 route_wrapper中
    result = endpoint(self, *args, **params_ok)
  文件 "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", 第46行, 在 call_button中
    action = self._call_kw(model, method, args, kwargs)
  文件 "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", 第33行, 在 _call_kw中
    return call_kw(request.env[model], method, args, kwargs)
  文件 "/usr/lib/python3/dist-packages/odoo/api.py", 第461行, 在 call_kw中
    result = _call_kw_multi(method, model, args, kwargs)
  文件 "/usr/lib/python3/dist-packages/odoo/api.py", 第448行, 在 _call_kw_multi中
    result = method(recs, *args, **kwargs)
  文件 "/mnt/extra-addons/om_export_import_product_image_zip/wizard/import_product_image_wizard.py", 第44行, 在 import_product_images中
    shutil.make_archive(file_path, 'zip', file_path)
  文件 "/usr/lib/python3.9/shutil.py", 第1063行, 在 make_archive中
    filename = func(base_name, base_dir, **kwargs)
  文件 "/usr/lib/python3.9/shutil.py", 第944行, 在 _make_zipfile中
    with zipfile.ZipFile(zip_filename, "w",
  文件 "/usr/lib/python3.9/zipfile.py", 第1239行, 在 __init__中
    self.fp = io.open(file, filemode)
PermissionError: [Errno 13] 权限被拒绝: '/mnt/extra-addons/om_export_import_product_image_zip/product_image.zip'

上述服务器错误导致以下客户端错误:
RPC_ERROR: Odoo服务器错误
    at makeErrorFromResponse (https://alpha.clicktheory.ca/web/assets/1904-01dcc54/web.assets_backend.min.js:967:163)
    at XMLHttpRequest.<anonymous> (https://alpha.clicktheory.ca/web/assets/1904-01dcc54/web.assets_backend.min.js:974:13)

权限问题根源

  1. privileged模式作用误解:该模式仅赋予容器访问主机设备、修改内核参数等系统级权限,不会改变容器内文件系统的用户/组权限归属。容器内文件权限仍遵循Linux权限规则,即使容器开启privileged,运行Odoo的用户没有目标目录写入权限,依然会报错。
  2. 挂载目录权限不匹配:Odoo官方镜像默认用odoo用户(UID/GID通常为1000)运行,主机上挂载的/mnt/extra-addons目录如果是root用户创建的,容器内的odoo用户仅拥有读取权限,无法写入文件。手动创建目录只是解决了“创建”动作,但目录所有者还是主机的root,容器内用户依然写不了文件。

解决方法

1. 调整主机挂载目录权限(推荐)

修改主机上extra-addons目录的归属,让容器内的odoo用户拥有读写权限:

# 替换为你主机上实际的extra-addons目录路径
sudo chown -R 1000:1000 /opt/odoo/extra-addons

如果不确定容器内odoo用户的UID/GID,先进入容器查看:

docker exec -it <你的Odoo容器名> id odoo

2. 修改容器运行用户(应急方案,不推荐)

启动容器时指定用root用户运行,容器内将拥有最高权限,但存在安全风险:

docker run -d --user root <其他启动参数> odoo:16

3. 更改文件写入路径(最佳实践)

Odoo模块目录应保持只读,避免更新模块时覆盖生成的文件。建议把临时文件、生成的zip文件写到容器内的临时目录或Odoo的filestore目录:

# 示例:用临时目录生成zip
import tempfile
import shutil

# 创建临时目录
temp_dir = tempfile.mkdtemp()
# 生成zip到临时路径
zip_base_path = '/tmp/product_image'
shutil.make_archive(zip_base_path, 'zip', temp_dir)
# 使用生成的zip文件:/tmp/product_image.zip

内容的提问来源于stack exchange,提问作者Mahdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:33:11