Docker Compose部署Odoo17多实例连接PostgreSQL16失败求助
问题排查与解决方案
核心问题分析
Odoo容器启动后立即退出,日志显示Database connection failure: could not translate host name 'db' to address: Temporary failure in name resolution,本质是Odoo容器无法解析到对应的PostgreSQL服务主机名,结合你要部署4组独立容器的需求,大概率是以下原因:
- 多组容器共用默认网络,导致服务名(如
db)冲突,Odoo无法定位到对应组的PostgreSQL - 每组未配置独立网络,Odoo与对应PostgreSQL不在同一网络段内
- Odoo的数据库主机配置错误,指向了不存在的服务名
正确的Docker Compose配置示例
以下是4组独立Odoo17+PostgreSQL16的配置,每组完全隔离,端口、数据库配置互不干扰:
version: '3.8' # 第一组:Odoo17 + PostgreSQL16 services: odoo1: image: odoo:17 container_name: odoo1 ports: - "8069:8069" environment: - HOST=db1 - USER=odoo_user1 - PASSWORD=odoo_pass1 - DB_NAME=odoo_db1 volumes: - odoo1_data:/var/lib/odoo - odoo1_addons:/mnt/extra-addons networks: - odoo_net1 depends_on: - db1 db1: image: postgres:16 container_name: db1 ports: - "5432:5432" environment: - POSTGRES_USER=odoo_user1 - POSTGRES_PASSWORD=odoo_pass1 - POSTGRES_DB=odoo_db1 - PGDATA=/var/lib/postgresql/data/pgdata volumes: - db1_data:/var/lib/postgresql/data networks: - odoo_net1 # 第二组:Odoo17 + PostgreSQL16 services: odoo2: image: odoo:17 container_name: odoo2 ports: - "8070:8069" environment: - HOST=db2 - USER=odoo_user2 - PASSWORD=odoo_pass2 - DB_NAME=odoo_db2 volumes: - odoo2_data:/var/lib/odoo - odoo2_addons:/mnt/extra-addons networks: - odoo_net2 depends_on: - db2 db2: image: postgres:16 container_name: db2 ports: - "5433:5432" environment: - POSTGRES_USER=odoo_user2 - POSTGRES_PASSWORD=odoo_pass2 - POSTGRES_DB=odoo_db2 - PGDATA=/var/lib/postgresql/data/pgdata volumes: - db2_data:/var/lib/postgresql/data networks: - odoo_net2 # 第三组:Odoo17 + PostgreSQL16 services: odoo3: image: odoo:17 container_name: odoo3 ports: - "8071:8069" environment: - HOST=db3 - USER=odoo_user3 - PASSWORD=odoo_pass3 - DB_NAME=odoo_db3 volumes: - odoo3_data:/var/lib/odoo - odoo3_addons:/mnt/extra-addons networks: - odoo_net3 depends_on: - db3 db3: image: postgres:16 container_name: db3 ports: - "5434:5432" environment: - POSTGRES_USER=odoo_user3 - POSTGRES_PASSWORD=odoo_pass3 - POSTGRES_DB=odoo_db3 - PGDATA=/var/lib/postgresql/data/pgdata volumes: - db3_data:/var/lib/postgresql/data networks: - odoo_net3 # 第四组:Odoo17 + PostgreSQL16 services: odoo4: image: odoo:17 container_name: odoo4 ports: - "8072:8069" environment: - HOST=db4 - USER=odoo_user4 - PASSWORD=odoo_pass4 - DB_NAME=odoo_db4 volumes: - odoo4_data:/var/lib/odoo - odoo4_addons:/mnt/extra-addons networks: - odoo_net4 depends_on: - db4 db4: image: postgres:16 container_name: db4 ports: - "5435:5432" environment: - POSTGRES_USER=odoo_user4 - POSTGRES_PASSWORD=odoo_pass4 - POSTGRES_DB=odoo_db4 - PGDATA=/var/lib/postgresql/data/pgdata volumes: - db4_data:/var/lib/postgresql/data networks: - odoo_net4 # 定义所有独立卷和网络 volumes: odoo1_data: odoo1_addons: db1_data: odoo2_data: odoo2_addons: db2_data: odoo3_data: odoo3_addons: db3_data: odoo4_data: odoo4_addons: db4_data: networks: odoo_net1: driver: bridge odoo_net2: driver: bridge odoo_net3: driver: bridge odoo_net4: driver: bridge
关键配置要点
- 独立网络:每组配置专属的bridge网络(如
odoo_net1),确保组内容器互通,组间完全隔离 - 唯一服务名/容器名:数据库服务名设为
db1、db2等,Odoo的HOST环境变量对应指向这些服务名,Docker Compose会自动在组内网络解析这些名称 - 端口不冲突:Odoo映射到主机的8069-8072,PostgreSQL映射到5432-5435,避免端口占用
- 环境变量匹配:每组的
POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB必须和Odoo的USER、PASSWORD、DB_NAME完全一致 - 独立数据卷:每组使用单独的卷存储Odoo和PostgreSQL数据,防止数据混淆
排查验证步骤
- 检查容器状态:执行
docker ps -a,确认PostgreSQL容器处于Up状态,Odoo容器是否正常启动 - 测试网络连通性:进入任意Odoo容器,ping对应数据库服务名,比如
docker exec -it odoo1 ping db1,如果能ping通说明网络配置正常 - 查看完整日志:执行
docker logs odoo1(替换为对应Odoo容器名),确认是否有其他错误信息 - 清理旧容器:如果之前有残留容器,执行
docker compose down -v清理旧容器和卷,再重新启动
内容的提问来源于stack exchange,提问作者Néo SONDI
相关产品推荐
相关产品推荐

