
iterativodo/dockerdooDockerdoo是一个灵活且精简的Docker化Odoo项目,提供两种基于同一Dockerfile的部署方式:
./src/odoo目录)并挂载到容器内,适用于开发场景(需直接修改Odoo核心代码时)。该镜像与VSCode深度集成以实现快速开发和调试,只需安装Remote Containers扩展即可。
针对不同Odoo版本(15.0、16.0、17.0、18.0、master)和架构(linux/amd64、linux/arm64)的预构建镜像,通过GitHub Actions自动构建、测试并发布至以下仓库:
ghcr.io/iterativo-git/dockerdoo:<odoo_version>(如ghcr.io/iterativo-git/dockerdoo:17.0)iterativodo/dockerdoo:<odoo_version>gcr.io/iterativo/dockerdoo:<odoo_version>通常可直接拉取预构建镜像(确保Compose文件中设置image: iterativodo/dockerdoo:${ODOO_VERSION}且.env文件定义ODOO_VERSION),无需本地构建,节省时间。
shellgit clone ***:iterativo-git/dockerdoo.git && cd dockerdoo
复制示例环境变量文件.env.example为.env,并调整变量值,特别是ODOO_VERSION(Odoo版本)和PSQL_VERSION(PostgreSQL版本)。
使用预构建镜像或构建包含Odoo源代码的镜像:
shell# 确保.env文件中已设置ODOO_VERSION docker-compose build # 可选:仅在不使用预构建镜像或修改Dockerfile时需要 docker-compose up -d
需先将Odoo源代码克隆至./src/odoo目录:
shell# 克隆指定版本的Odoo源代码(以17.0为例) git clone --depth=1 -b 17.0 ***:odoo/odoo.git src/odoo # 确保.env文件中的ODOO_VERSION与克隆的源代码版本一致 docker-compose -f docker-compose.yml -f hosted.yml build # 通常需要构建 docker-compose -f docker-compose.yml -f hosted.yml up -d
.env文件(从.env.example复制)是核心配置,关键变量包括:
ODOO_VERSION:指定Odoo版本(如17.0),必须与预构建镜像标签或宿主模式下克隆的源代码版本匹配PSQL_VERSION:PostgreSQL数据库版本(如16)POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORD:数据库凭据ADMIN_PASSWORD:Odoo新数据库的超级管理员密码PIP_AUTO_INSTALL=1:设为1时,启动时自动安装自定义模块的Python依赖UPGRADE_ODOO=1:设为1时,启动时执行odoo -u all(升级所有模块)RUN_TESTS=1:设为1时,启动时运行Odoo测试(可通过WITHOUT_TEST_TAGS排除特定测试标签)ODOO_RC:容器内Odoo配置文件路径(默认/etc/odoo/odoo.conf),由入口脚本根据环境变量管理更多环境变量可查看Dockerfile和resources/entrypoint.sh文件。
可通过--build-arg自定义Docker镜像构建:
shelldocker-compose build --build-arg PYTHON_VERSION=3.11-slim --build-arg ODOO_VERSION=17.0
可用参数(详见Dockerfile):PYTHON_VERSION(Python版本)、OS_VARIANT(操作系统变体)、ODOO_VERSION(Odoo版本)、WKHTMLTOX_VERSION(WKHTMLToX版本)、APP_UID(应用用户ID)、APP_GID(应用用户组ID)。
通过组合多个Compose文件实现不同配置:
docker-compose.yml:基础配置(独立模式)hosted.yml:宿主模式覆盖(挂载./src/odoo目录)dev-standalone.yml:独立模式开发工具(如--dev=all、WDB调试)dev-hosted.yml:宿主模式开发工具test-env.yml:运行Odoo测试配置(--test-enable --stop-after-init)使用-f参数组合文件:
shell# 宿主模式开发 docker-compose -f docker-compose.yml -f hosted.yml -f dev-hosted.yml up # 运行测试(独立模式) docker-compose -f docker-compose.yml -f test-env.yml up
将自定义Odoo模块放在./custom/目录的子目录中(如./custom/my_cool_module/、./custom/oca_addons/web/)。
入口脚本entrypoint.sh会运行getaddons.py,扫描${ODOO_EXTRA_ADDONS}路径(默认/mnt/extra-addons,即docker-compose.yml中挂载的./custom目录),查找包含__manifest__.py或__openerp__.py的有效模块目录,并将其添加到Odoo的addons_path配置中。
1. 挂载式模块(推荐本地开发):
./custom目录(或其子目录)dev-hosted.yml或dev-standalone.yml),将./custom目录挂载到容器内/mnt/extra-addons-u升级)./custom目录(或其中特定模块)添加到.gitignore,避免提交到当前仓库(若模块在单独仓库管理)2. 内置式模块(推荐生产镜像或共享): 如需创建包含自定义模块的独立镜像,需基于Dockerdoo基础镜像构建自定义镜像:
dockerfile# 添加自定义模块的示例Dockerfile ARG ODOO_VERSION=18.0 # 替换为所需版本 FROM iterativodo/dockerdoo:${ODOO_VERSION} # 设置标准环境变量(可被覆盖) ENV ODOO_EXTRA_ADDONS=/mnt/extra-addons # 切换至root用户进行安装操作 USER root # 从本地目录复制自定义模块(假设模块在./my_addons目录) COPY --chown=${ODOO_USER}:${ODOO_USER} ./my_addons ${ODOO_EXTRA_ADDONS}/my_addons # 安装自定义模块的Python依赖 RUN apt-get update && apt-get install -y --no-install-recommends build-essential \ && find ${ODOO_EXTRA_ADDONS}/my_addons -name 'requirements.txt' -exec pip3 --no-cache-dir install -r {} \; \ && apt-get purge -y --auto-remove build-essential \ && rm -rf /var/lib/apt/lists/* # 切换回默认odoo用户 USER ${ODOO_USER}
构建自定义镜像:
shelldocker build -t my-custom-odoo:latest .
更新docker-compose.yml(或生产覆盖文件)使用自定义镜像:image: my-custom-odoo:latest
基础docker-compose.yml将宿主机~/.ssh/目录挂载到容器内/opt/odoo/.ssh/,使容器内进程(如从私有Git仓库安装Python依赖)可使用本地SSH密钥进行身份验证。
8069:Odoo HTTP接口8072:Odoo长轮询(Longpolling)端口bashyour-project/ ├── resources/ # 容器内使用的脚本(entrypoint.sh、getaddons.py等) ├── src/ │ └── odoo/ # Odoo源代码(仅宿主模式需要) ├── custom/ # 自定义Odoo模块(放在子目录中) │ ├── my_module_1/ │ └── my_module_2/ ├── .github/ # GitHub Actions工作流(CI/CD) ├── .env.example # 环境变量示例文件(复制为.env使用) ├── .env # 本地环境变量(Git忽略) ├── Dockerfile # Odoo镜像构建文件 ├── docker-compose.yml # 基础Compose配置 ├── hosted.yml # 宿主模式覆盖配置 ├── dev-standalone.yml # 独立模式开发覆盖配置 ├── dev-hosted.yml # 宿主模式开发覆盖配置 ├── test-env.yml # 测试环境覆盖配置 └── ... # 其他文件(.gitignore、README.md等)
主要基于以下项目的工作:
借鉴了以下项目的思路:
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务