如何在Odoo 14 Docker容器中安装cryptography库?
问题场景
我在macOS Monterey(12.5.1)上通过Docker Desktop部署Odoo 14,使用的docker-compose.yaml配置如下:
version: '2' services: web: image: odoo:14.0 depends_on: - db ports: - "8069:8069" volumes: - odoo-web-data:/var/lib/odoo - ./config:/etc/odoo - ./addons:/mnt/extra-addons db: image: postgres:10 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo - POSTGRES_USER=odoo - PGDATA=/var/lib/postgresql/data/pgdata volumes: - odoo-db-data:/var/lib/postgresql/data/pgdata - ./db:/db volumes: odoo-web-data: odoo-db-data:
尝试安装Odoo电商模块时失败,报错:
Unable to install module "account_edi_proxy_client" because an external dependency is not met: Python library not installed: cryptography
本地执行pip3 install cryptography显示已安装,但问题未解决;安装pycryptodome也无效。进入Docker容器执行docker exec -it [container_name] pip3 install cryptography时,出现编译错误:
Command "/usr/bin/python3 -m pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-ynyd_o0_ --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools>=40.6.0,!=60.9.0 wheel "cffi>=1.12; platform_python_implementation != 'PyPy'" setuptools-rust>=0.11.4" failed with error code 1 in None
问题原因及解决方法
原因
官方Odoo 14镜像缺少编译cryptography所需的系统依赖(比如C编译器、rust环境、libssl开发库等),导致pip安装时无法编译源码。
解决步骤
方法1:构建自定义镜像(长期有效,推荐)
- 在项目根目录创建
Dockerfile:
FROM odoo:14.0 USER root # 安装编译cryptography所需的系统依赖 RUN apt-get update && apt-get install -y \ gcc \ python3-dev \ libssl-dev \ rustc \ cargo \ && rm -rf /var/lib/apt/lists/* # 安装cryptography库 RUN pip3 install cryptography USER odoo
- 修改
docker-compose.yaml中web服务的配置,替换为自定义构建:
services: web: build: . # 替换原有的image: odoo:14.0 depends_on: - db # 其余端口、卷配置保持不变
- 重新构建并启动容器:
docker-compose up --build -d
方法2:临时在容器内安装依赖(临时有效)
如果不想构建镜像,可临时操作:
- 以root身份进入容器:
docker exec -it -u root [container_name] bash
- 更新apt源并安装系统依赖:
apt-get update && apt-get install -y gcc python3-dev libssl-dev rustc cargo
- 安装cryptography:
pip3 install cryptography
- 退出容器并重启Odoo服务:
docker restart [container_name]
注意:方法2的修改仅对当前容器有效,容器重建后会丢失配置,长期使用优先选择方法1。
内容的提问来源于stack exchange,提问作者george

