使用docker-compose运行Odoo时服务无法访问,数据库连接超时求助
问题:Docker-Compose运行Odoo时数据库连接超时错误
我尝试用docker-compose运行Odoo,单独启动Postgres和Odoo容器时服务可正常访问,但使用最简docker-compose示例时,Postgres启动日志显示已就绪,Odoo容器却出现连接超时错误并退出。
错误日志
Attaching to testdocker_db_1, testdocker_web_1 db_1 | db_1 | PostgreSQL Database directory appears to contain a database; Skipping initialization db_1 | db_1 | 2022-09-01 14:54:47.015 UTC [1] LOG: starting PostgreSQL 14.5 (Debian 14.5-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit db_1 | 2022-09-01 14:54:47.016 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 db_1 | 2022-09-01 14:54:47.016 UTC [1] LOG: listening on IPv6 address "::", port 5432 db_1 | 2022-09-01 14:54:47.021 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" db_1 | 2022-09-01 14:54:47.027 UTC [26] LOG: database system was shut down at 2022-09-01 14:54:22 UTC db_1 | 2022-09-01 14:54:47.033 UTC [1] LOG: database system is ready to accept connections web_1 | Database connection failure: connection to server at "db" (172.21.0.2), port 5432 failed: Connection timed out web_1 | Is the server running on that host and accepting TCP/IP connections? web_1 | testdocker_web_1 exited with code 1
使用的docker-compose.yml
version: '3.1' services: web: image: odoo:15.0 depends_on: - db ports: - "8069:8069" db: image: postgres:14 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo - POSTGRES_USER=odoo
排查方案
1. 解决depends_on的局限性
depends_on仅保证容器启动顺序,不确保Postgres服务完全就绪。添加健康检查,让Odoo等待Postgres真正可用:
version: '3.1' services: web: image: odoo:15.0 depends_on: db: condition: service_healthy ports: - "8069:8069" db: image: postgres:14 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo - POSTGRES_USER=odoo healthcheck: test: ["CMD-SHELL", "pg_isready -U odoo -d postgres"] interval: 5s timeout: 5s retries: 5
2. 清理旧容器与数据卷
之前单独启动的Postgres可能留下不一致的旧数据卷,执行以下命令清理后重新启动:
docker-compose down -v docker-compose up -d
3. 验证网络连通性
进入Odoo容器手动测试Postgres连接,确认网络是否正常:
docker exec -it testdocker_web_1 bash psql -h db -U odoo -d postgres
如果连接失败,需检查Docker网络配置;如果成功,说明是Odoo启动时机过早,健康检查方案可解决。
4. 手动指定自定义网络
添加显式网络配置,避免默认网络出现异常:
version: '3.1' services: web: image: odoo:15.0 depends_on: - db ports: - "8069:8069" networks: - odoo-network db: image: postgres:14 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo - POSTGRES_USER=odoo networks: - odoo-network networks: odoo-network: driver: bridge
内容的提问来源于stack exchange,提问作者kpg
相关产品推荐
相关产品推荐

