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)
权限问题根源
privileged模式作用误解:该模式仅赋予容器访问主机设备、修改内核参数等系统级权限,不会改变容器内文件系统的用户/组权限归属。容器内文件权限仍遵循Linux权限规则,即使容器开启privileged,运行Odoo的用户没有目标目录写入权限,依然会报错。- 挂载目录权限不匹配: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
相关产品推荐
相关产品推荐

