简介本资源是一份面向企业级Odoo运维工程师与SaaS平台架构师的实战部署指南聚焦基于Docker的多租户Odoo实例自动化管理方案解决中小企业快速交付定制化SaaS服务、统一维护数百租户环境及实现订阅制计费等核心痛点。内容涵盖Python依赖安装docker/erppeek/paramiko、Odoo-SaaS-Data等关键目录结构搭建、Nginx虚拟主机与PostgreSQL配置、基础Docker镜像构建含UID/GID对齐要点、远程容器部署支持及SaaS订阅计划配置全流程并提供模块上传、域名管理、日志排查、备份恢复等高频运维场景的排错思路。资源为1个3.99MB的PDF文档内容完整覆盖环境准备、安装步骤、权限配置、测试验证与常见问题处理结构清晰、指令明确适合作为生产环境部署前的标准化参考手册。目前已有140人学习下载适合具备Linux服务器管理、Odoo二次开发及基础Docker经验的技术人员深度研读与落地实施。1. Odoo SaaS Kit 不是“一键部署”而是你亲手搭出来的多租户黑匣子它把每个客户塞进独立 Docker 容器用 Nginx 做门卫、PostgreSQL 当账房、Odoo 当掌柜——但凡一个 UID 没对齐、一个 vhost 模板少个斜杠、一个 saas.conf 路径写错整个租户系统就卡在“创建中…”不动弹。这不是插件安装是基础设施编排不靠点击向导靠你对docker build的耐心、对/etc/sudoers的敬畏、对pg_hba.confCIDR 规则的肌肉记忆。适合刚从单体 Odoo 运维跳出来、正被客户反复问“能不能给我单独一个后台”的工程师——你得信自己能管住 50 个容器、200 个数据库、300 个子域名而不是指望某个按钮替你扛下所有边界条件。2. 从零构建 Odoo SaaS 基础镜像Dockerfile 里藏了三个必须死磕的硬核细节Odoo SaaS Kit 的核心不是 Python 模块是那个被docker build编译出来的基础镜像。它不是官方 Odoo 镜像的简单复刻而是一套严格对齐宿主机环境的“镜像契约”。一旦镜像 UID/GID 错位、entrypoint 权限缺失、或配置路径硬编码错误后续所有客户端容器都会在启动时静默失败——日志里只有一行Permission denied连报错堆栈都不给你。下面这三步每一步都踩过血泪坑不能跳。2.1 UID/GID 对齐为什么你的容器永远挂载不了 /var/lib/odoo/dataOdoo SaaS Kit 的设计哲学是宿主机上的文件所有权必须和容器内完全一致。它不走 volume 绑定的“宽松模式”而是用-v /host/path:/container/path:z强制映射且要求chown -R odoo:odoo /host/path后容器内id -u odoo必须等于宿主机id -u odoo。否则容器内 Odoo 进程根本打不开odoo.conf更别说写入 session 或附件。提示别查whoami查/etc/passwd。执行grep odoo /etc/passwd拿到类似odoo:x:998:998::/opt/odoo:/bin/bash:/sbin/nologin的行其中998:998就是你要死记的 UID:GID。在 Dockerfile 开头必须显式声明用户 ID# Dockerfile FROM ubuntu:20.04 # 关键必须与宿主机 odoo 用户 UID/GID 严格一致 ARG ODIO_UID998 ARG ODIO_GID998 # 创建同名用户组和用户UID/GID 硬编码 RUN groupadd -g ${ODIO_GID} odoo \ useradd -m -u ${ODIO_UID} -g ${ODIO_GID} -s /bin/bash odoo # 切换到 odoo 用户后续所有 RUN、CMD 都在此上下文 USER odoo:odoo参数说明ARG ODIO_UID/GID是构建时传入的变量方便不同环境复用同一份 Dockerfilegroupadd -g和useradd -u中的-g-u参数强制指定 GID/UID避免系统自动分配USER odoo:odoo必须放在所有RUN apt install之后、COPY之前——因为apt install需要 root但COPY --chownodoo:odoo后的文件必须由USER指定的用户来读取。2.2 entrypoint.sh那个被忽略的“容器启动守门人”Odoo SaaS Kit 不直接docker run odoo:14.0而是通过自定义entrypoint.sh控制整个生命周期。这个脚本干三件事校验配置路径、动态生成odoo.conf、检查 PostgreSQL 连通性。如果它没被执行或者权限不对容器会秒退docker logs里空空如也。先确保entrypoint.sh在宿主机上具备可执行权限并归属 odoo 用户# 在宿主机执行假设 Dockerfile 和 entrypoint.sh 同目录 chmod x entrypoint.sh chown odoo:odoo entrypoint.shDockerfile 中必须 COPY 并设权# Dockerfile续 COPY --chownodoo:odoo entrypoint.sh /home/odoo/entrypoint.sh RUN chmod x /home/odoo/entrypoint.sh # 设置入口点注意不是 CMD ENTRYPOINT [/home/odoo/entrypoint.sh]entrypoint.sh的关键逻辑节选带注释#!/bin/bash # entrypoint.sh # 1. 校验 saas.conf 是否存在且可读这是 odoo_saas_kit 模块的配置中枢 if [ ! -f /home/odoo/saas.conf ]; then echo ERROR: /home/odoo/saas.conf not found. This is required by Odoo SaaS Kit. exit 1 fi # 2. 动态生成 odoo.conf从模板注入 client_id、db_host、db_port 等运行时参数 # SaaS Kit 在创建容器时会通过 --env 注入这些变量 cat /etc/odoo/odoo.conf EOF [options] admin_passwd ${ADMIN_PASSWD:-change_me} db_host ${DB_HOST:-localhost} db_port ${DB_PORT:-5432} db_user ${DB_USER:-odoo} db_password ${DB_PASSWORD:-odoo} addons_path /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons data_dir /var/lib/odoo logfile /var/log/odoo/odoo-server.log log_level info EOF # 3. 等待 PostgreSQL 就绪避免容器启动快于 DB导致 Odoo 初始化失败 until pg_isready -h ${DB_HOST:-localhost} -p ${DB_PORT:-5432} -U ${DB_USER:-odoo}; do echo Waiting for PostgreSQL at ${DB_HOST:-localhost}:${DB_PORT:-5432}... sleep 2 done # 4. 最终执行 Odoo 启动命令 exec /usr/bin/odoo $参数说明--env注入的变量如DB_HOST,ADMIN_PASSWD必须与odoo_saas_kit模块在调用docker run时传入的完全一致pg_isready是 PostgreSQL 自带的健康检查工具比sleep 10可靠十倍exec是关键它用 Odoo 进程替换当前 shell 进程保证docker stop能正常发送 SIGTERM。2.3 构建与推送docker build命令末尾那个点不是装饰构建命令本身极简但路径、上下文、标签三者必须咬合# 切换到 Dockerfile 所在目录绝对路径 cd /opt/odoo/docker-build/ # 构建命令注意最后的 . 是当前目录上下文不可省略 docker build \ --build-arg ODIO_UID998 \ --build-arg ODIO_GID998 \ -t odoosaas:14.0-ubuntu20.04 \ . # 验证镜像是否包含正确用户 docker run --rm odoosaas:14.0-ubuntu20.04 id -u odoo # 应输出 998 docker run --rm odoosaas:14.0-ubuntu20.04 ls -l /etc/odoo/odoo.conf # 应显示 odoo:odoo 所有者常见失败现象与排查docker build报错unable to prepare context: path .../Dockerfile not found→ 检查当前目录是否真有DockerfileLinux 区分大小写构建成功但docker run启动即退出 →docker logs container_id查看90% 是entrypoint.sh权限问题或saas.conf路径错误docker run启动后ps aux | grep odoo没进程 →docker exec -it container_id bash进去手动执行sh -x /home/odoo/entrypoint.sh看哪一行卡住。3. Odoo 服务账户提权给 odoo 用户开三把锁一把都不能少Odoo SaaS Kit 的模块代码运行在 Odoo 进程内但它要干的事远超普通业务逻辑它要调用docker命令创建容器、要sudo nginx -t sudo systemctl reload nginx重载虚拟主机、还要psql连 PostgreSQL 创建数据库。默认的odoo用户什么权限都没有——你得亲手给它开三把锁缺一不可。3.1 Docker 组权限让 odoo 用户成为容器调度员Docker 守护进程默认只允许root或docker组成员操作。odoo_saas_kit模块底层调用的是docker-pyPython 的 Docker SDK它最终会触发docker.sock的 Unix socket 通信。所以必须把odoo用户加进docker组# 添加用户到 docker 组立即生效需重新登录或重启 odoo 服务 sudo usermod -a -G docker odoo # 验证切换到 odoo 用户测试能否列出镜像 sudo -u odoo docker images # 若报错 Got permission denied...说明组未生效执行 newgrp docker # 临时刷新组权限仅当前 shell注意newgrp docker只影响当前终端会话。生产环境务必重启 Odoo 服务sudo systemctl restart odoo让 Odoo 进程以新组权限启动。3.2 Nginx 免密控制让 odoo 用户能 reload 配置而不输密码SaaS Kit 在创建客户端时会自动生成 Nginx 虚拟主机配置如/opt/odoo/Odoo-SAAS-Data/docker_vhosts/client1.example.com.conf然后执行sudo nginx -t sudo systemctl reload nginx。这意味着odoo用户必须被授权执行这两条命令且无需密码。编辑/etc/sudoers必须用visudo禁止直接 vimsudo visudo在文件末尾添加严格按格式空格和标点不能错# 允许 odoo 用户免密执行 nginx 测试和重载 odoo ALL(ALL) NOPASSWD: /usr/sbin/nginx -t, /bin/systemctl reload nginx验证方式切到 odoo 用户执行sudo -u odoo sudo nginx -t # 应输出 syntax is ok sudo -u odoo sudo systemctl reload nginx # 应无报错Nginx 配置热更新提示systemctl reload nginx在 Ubuntu 20.04 是安全的它等价于nginx -s reload不会中断现有连接。3.3 PostgreSQL 数据库权限不只是登录是建库建用户的权力SaaS Kit 创建客户端时会连接 PostgreSQL 并执行CREATE DATABASE client1;和CREATE USER client1 WITH PASSWORD xxx;。这意味着odoo用户连接 PostgreSQL 时必须拥有CREATEDB和CREATEROLE权限。登录 PostgreSQL用 postgres 用户sudo -u postgres psql执行授权假设你的 PostgreSQL 超级用户是postgresSaaS Kit 连接用的用户是odoo-- 确保 odoo 用户存在若不存在则创建 CREATE USER odoo WITH PASSWORD your_strong_password; -- 授予创建数据库和角色的权限 ALTER USER odoo CREATEDB CREATEROLE; -- 验证 \du odoo -- 输出中应看到 Create DB 和 Create role 为 true同时必须修改 PostgreSQL 的访问控制文件pg_hba.conf允许odoo用户从 Docker 网络通常是172.17.0.0/16连接# 编辑 /etc/postgresql/*/main/pg_hba.conf在末尾添加 # TYPE DATABASE USER ADDRESS METHOD host all odoo 172.17.0.0/16 md5 host all odoo 127.0.0.1/32 md5然后重载配置sudo systemctl reload postgresql避坑 / 常见问题 / 排查现象SaaS Kit 创建客户端时卡在 “Creating database…” 10 分钟日志里只有psycopg2.OperationalError: timeout expired原因pg_hba.conf没加172.17.0.0/16规则或postgresql.conf中listen_addresses没设为localhost,127.0.0.1默认只监听本地 socket解决检查sudo cat /etc/postgresql/*/main/postgresql.conf | grep listen_addresses确保为listen_addresses localhost,127.0.0.1再确认pg_hba.conf规则已加并重载。现象sudo -u odoo docker images正常但 Odoo 后台点击“创建客户端”报错Command docker not found原因odoo用户的$PATH环境变量里没有/usr/binDocker 二进制通常在此解决编辑/etc/systemd/system/odoo.service在[Service]段添加EnvironmentPATH/usr/local/bin:/usr/bin:/bin然后sudo systemctl daemon-reload sudo systemctl restart odoo。现象Nginx 虚拟主机配置生成了但sudo nginx -t报错unknown directive upstream原因odoo_saas_kit生成的.conf文件里用了upstream块但你的 Nginx 编译时没启用http_upstream_module极少见但某些精简版镜像会有解决nginx -V 21 | grep -o with-http_upstream_module若无输出则重装标准 Nginxsudo apt install --reinstall nginx-full。现象odoo_saas_kit模块安装后后台“SaaS 服务器”配置页空白F12 看 Network 有 500 错误原因saas.conf文件路径配置错误或odoo_saas_kit/models/lib/saas.conf里写的nginx_vhosts /wrong/path导致 Python 读取失败解决进入 Odoo 服务端 Python shellsudo -u odoo python3 -c from odoo_saas_kit.models.lib import saas; print(saas.nginx_vhosts)确认路径是否真实存在且odoo用户可读。4. SaaS 服务器与远程节点配置跨服务器部署不是加台机器是重建信任链Odoo SaaS Kit 支持“主控服务器 多台远程计算节点”的架构。但这不是简单的docker run分发而是一整套 SSH、Docker、PostgreSQL 的信任链重建。主服务器上的odoo_saas_kit模块会通过paramiko库 SSH 登录远程服务器再调用其本地docker命令。任何一环断开远程部署就变成灰色按钮。4.1 远程服务器初始化UID/GID 必须和主服务器 odoo 用户完全一致这是跨服务器部署的第一铁律。远程服务器上新建的odoo用户UID/GID 必须和主服务器odoo用户一模一样。否则当主服务器通过paramiko执行docker run -v /host/path:/container/path时容器内进程会因 UID 不匹配而无法读写挂载卷。在远程服务器上执行假设主服务器odooUID998, GID998# 创建系统用户UID/GID 强制指定 sudo adduser --system --home /opt/odoo --shell /bin/bash --uid 998 --gid 998 odoo # 设置密码SaaS Kit 用密码 SSH不用密钥 sudo passwd odoo # 安装 Docker同主服务器步骤 curl -fsSL https://get.docker.com | sh sudo usermod -aG docker odoo提示--system创建的是无登录 shell 的系统用户符合 Odoo 生产部署规范--home /opt/odoo路径必须和主服务器一致因为odoo_saas_kit模块会硬编码该路径生成配置。4.2 Docker 守护进程暴露tcp://0.0.0.0:2375 是把双刃剑odoo_saas_kit调用docker-py连接远程 Docker 守护进程用的是 TCP 协议docker://tcp://remote-ip:2375。这意味着远程服务器的 Docker 必须监听 TCP 端口而非默认的 Unix socket。修改/lib/systemd/system/docker.service# 找到 ExecStart 行改为 ExecStart/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375然后重载并重启sudo systemctl daemon-reload sudo systemctl restart docker但暴露 2375 端口极其危险必须立即配置防火墙只允许主服务器 IP 访问# Ubuntu UFW假设主服务器内网 IP 是 192.168.1.100 sudo ufw allow from 192.168.1.100 to any port 2375 sudo ufw enable提示ufw status verbose可查看规则是否生效。若用 iptables命令为sudo iptables -A INPUT -p tcp --dport 2375 -s 192.168.1.100 -j ACCEPT。4.3 主服务器连接测试用 Python 脚本代替 Odoo 后台点点点在主服务器上写一个最小化测试脚本绕过 Odoo 框架直连远程 Docker验证链路是否打通# test_remote_docker.py import docker # 替换为你的远程服务器 IP 和端口 client docker.DockerClient(base_urltcp://192.168.1.200:2375) try: # 列出远程镜像验证连接 images client.images.list() print(f✅ 连接成功远程有 {len(images)} 个镜像) # 尝试拉取一个轻量镜像可选 # client.images.pull(alpine:latest) # print(✅ alpine:latest 拉取成功) except Exception as e: print(f❌ 连接失败{e})执行sudo -u odoo python3 test_remote_docker.py只有这个脚本能跑通SaaS Kit 的远程部署才可能成功。后台配置里的“测试连接”按钮本质就是跑这段逻辑。5. SaaS 订阅计划与客户端实例从“创建模板”到“客户收到邮件”的全链路拆解SaaS Kit 的商业闭环始于一个订阅计划Plan终于一封发给客户的激活邮件。但中间每一步都是可编程的模板数据库的初始化、客户端容器的启动参数、Nginx 虚拟主机的动态生成、甚至邮件内容里的重置密码链接。这一章我们拆开odoo_saas_kit模块里最关键的三个动作创建模板、创建客户端、发送邮件。5.1 创建数据库模板不是备份还原是 Odoo 的“全新安装 模块预装”点击“创建数据库模板”按钮odoo_saas_kit实际执行的是调用erppeek连接 PostgreSQL执行CREATE DATABASE plan_template_123;启动一个临时 Odoo 容器用你配置的odoo_image连接此新库在该容器内执行odoo-bin -d plan_template_123 --init base,web,mail,hr,...--init后跟你在 Plan 中勾选的“相关模块”初始化完成后停掉临时容器模板库plan_template_123就绪。关键参数在 Plan 配置页数据库模板字段填my_plan_template则库名是my_plan_template留空则自动生成plan_template_123相关模块这里勾选的模块会作为--init参数传给 Odoo。注意这些模块必须存在于common_addons目录且版本兼容如 Odoo 14.0 的模块不能 init 到 12.0 容器计费周期纯业务逻辑不影响技术流程但决定了后续发票生成频率。5.2 创建客户端实例docker run命令的完整展开式当你点击“创建并确认客户端”odoo_saas_kit会拼出一条完整的docker run命令。我们可以从源码反推其结构odoo_saas_kit/models/saas_client.pydocker run -d \ --name client_john_doe \ --restart unless-stopped \ -p 8080:8069 \ -v /opt/odoo/Odoo-SAAS-Data/client_john_doe/data-dir:/var/lib/odoo \ -v /opt/odoo/Odoo-SAAS-Data/client_john_doe/odoo.conf:/etc/odoo/odoo.conf \ -v /opt/odoo/common_addons:/mnt/extra-addons \ -e DB_HOST192.168.1.100 \ -e DB_PORT5432 \ -e DB_USERclient_john_doe \ -e DB_PASSWORDstrong_pass_123 \ -e ADMIN_PASSWDmaster_key_456 \ --network bridge \ odoosaas:14.0-ubuntu20.04各参数含义--name client_john_doe容器名也是客户端域名如john.doe.example.com-v .../data-dir:/var/lib/odoo挂载数据目录odoo_saas_kit会在此目录下生成filestore/和session/-v .../odoo.conf:/etc/odoo/odoo.conf挂载配置文件odoo_saas_kit会根据 Plan 配置动态生成-v /opt/odoo/common_addons:/mnt/extra-addons挂载通用模块所有客户端共享-e DB_*数据库连接参数指向为该客户端创建的专属 PostgreSQL 用户odoosaas:14.0-ubuntu20.04你构建的基础镜像。5.3 邮件发送机制链接里的 token 是怎么生成的客户收到的邮件里有这样一个链接https://john.doe.example.com/web/reset_password?tokenabc123def456...这个token不是随机字符串而是 Odoo 标准的reset_passwordtoken由res.users模型的action_reset_password()方法生成。odoo_saas_kit在创建客户端后会调用self.env[res.users].create({...})创建管理员用户邮箱为客户填写的邮箱调用user.action_reset_password()生成 token 并存入res_users表的login_date字段实际是password_write_date拼接 URLhttps://{client_domain}/web/reset_password?token{token}。验证方式进入 Odoo 后台打开“设置 用户 公司 用户”找到该客户用户点击“重置密码”看弹出的链接是否和邮件里一致。提示如果邮件没收到先检查 Odoo 的邮件服务器配置Settings General Settings Email再检查odoo_saas_kit模块里models/saas_client.py的_send_welcome_email()方法是否被正确调用可在日志里搜welcome email sent。6. 日志、备份与故障定位当“创建中…”卡住时你该看哪 5 个地方SaaS Kit 的后台界面很友好但它的“友好”是建立在大量后台异步任务之上的。一旦卡在“创建中…”界面不会告诉你错在哪。你得像老中医一样望闻问切——看日志、查进程、验网络、翻配置、试命令。下面这五个位置是我每次翻车必查的“后悔药”。6.1 Odoo 服务端日志/var/log/odoo/odoo-server.log里的第一行线索这是最顶层的日志。搜索关键词# 查看最近 100 行过滤 saas 相关 sudo tail -100 /var/log/odoo/odoo-server.log | grep -i saas # 查看 ERROR 和 CRITICAL sudo grep -E (ERROR|CRITICAL) /var/log/odoo/odoo-server.log | tail -20典型线索odoo.addons.odoo_saas_kit.models.saas_client: Error creating client: Command [docker, run, ...] returned non-zero exit status 1→ Docker 命令失败转去看docker logspsycopg2.OperationalError: FATAL: password authentication failed for user client_xyz→ PostgreSQL 用户密码不对检查odoo_saas_kit/models/saas_client.py里create_db_user()的密码生成逻辑ValueError: invalid literal for int() with base 10: None→saas.conf里某个路径配置为空比如odoo_saas_data 后面没填路径。6.2 Docker 容器日志docker logs -f container_name是真相发生地当 Odoo 日志说“Docker 命令失败”立刻docker ps -a找到对应容器状态可能是Exited (1)然后# 查看退出容器的日志-f 无效用 --tail docker logs --tail 100 client_john_doe # 如果容器还在运行实时跟踪 docker logs -f client_john_doe高频错误Could not open config file /etc/odoo/odoo.conf: Permission denied→ UID/GID 不匹配容器内odoo用户无法读宿主机挂载的文件psycopg2.OperationalError: could not connect to server: Connection refused→DB_HOST配错了不是localhost容器内 localhost 是自己而是主服务器或远程 PostgreSQL 的 IPImportError: No module named hr→common_addons目录里没放hr模块或模块版本与 Odoo 版本不兼容。6.3 Nginx 错误日志/var/log/nginx/error.log揭露 502 的真正凶手客户端域名能解析但打开是 502 Bad Gateway一定是 Nginx 没转发到后端 Odoo 容器。查sudo tail -50 /var/log/nginx/error.log | grep client_john_doe关键线索connect() failed (111: Connection refused) while connecting to upstream→ Nginx 配置里的proxy_pass http://127.0.0.1:8080;但容器没映射8080端口或容器根本没起来open() /etc/nginx/conf.d/client_john_doe.conf failed (2: No such file or directory)→odoo_saas_kit没生成 vhost 文件检查docker_vhosts目录权限和saas.conf里nginx_vhosts路径no resolver defined to resolve client_john_doe→ Nginx 配置用了域名解析但没配resolver改用 IP 地址。6.4 PostgreSQL 日志/var/log/postgresql/postgresql-*-main.log里的连接审计当 Odoo 报“数据库连接失败”但psql -h 192.168.1.100 -U odoo能连问题可能出在客户端专属用户上。查 PG 日志sudo tail -50 /var/log/postgresql/postgresql-*-main.log | grep -E (client_john_doe|FATAL)典型记录FATAL: password authentication failed for user client_john_doe→ 密码不匹配检查odoo_saas_kit创建用户时的password字段FATAL: database client_john_doe does not exist→ 数据库没创建成功回溯 Odoo 日志里CREATE DATABASE是否执行connection received: host172.17.0.3 port54322→ 看host后的 IP确认是不是 Docker 网络 IP172.17.x.x如果不是说明DB_HOST配错了。6.5 手动模拟创建流程用 5 行命令复现整个链路当所有日志都模糊我就会放弃 GUI用最原始的方式手动走一遍# 1. 手动创建 PostgreSQL 用户和库 sudo -u postgres psql -c CREATE DATABASE client_test; sudo -u postgres psql -c CREATE USER client_test WITH PASSWORD test123; # 2. 手动启动一个客户端容器复用你的基础镜像 docker run -d \ --name client_test \ -v /opt/odoo/Odoo-SAAS-Data/client_test/data-dir:/var/lib/odoo \ -v /opt/odoo/Odoo-SAAS-Data/client_test/odoo.conf:/etc/odoo/odoo.conf \ -e DB_HOST192.168.1.100 \ -e DB_USERclient_test \ -e DB_PASSWORDtest123 \ -e ADMIN_PASSWDmaster123 \ odoosaas:14.0-ubuntu20.04 # 3. 查看容器日志 docker logs -f client_test # 4. 如果成功手动创建 Nginx vhost复制一份 template cp /opt/odoo/Odoo-SAAS-Data/docker_vhosts/vhosttemplate.txt /opt/odoo/Odoo-SAAS-Data/docker_vhosts/client_test.conf sed -i s/{domain}/client.test.example.com/g; s/{port}/8080/g /opt/odoo/Odoo-SAAS-Data/docker_vhosts/client_test.conf sudo nginx -t sudo systemctl reload nginx # 5. 浏览器访问 client.test.example.com看是否能进 Odoo 登录页从那以后我每次遇到“创建中…”卡住都强制走一遍这 5 行命令——它逼我把所有隐式依赖路径、权限、网络、配置全部显式化。往往走到第 2 步docker run就报错真相瞬间大白。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?