Celery容器无法连接Postgres数据库问题排查求助
问题原因分析
- Celery容器未加载环境变量:你的
worker服务(Celery容器)在docker-compose.yml中没有配置env_file,导致无法读取.env里的DB_HOST等数据库连接参数,Django默认使用localhost尝试连接Postgres,但容器内部没有部署Postgres,因此出现找不到本地socket的错误。 - Celery容器未依赖Postgres服务:
worker的depends_on未包含db服务,虽然depends_on不保证Postgres完全就绪,但至少能保证启动顺序,避免Celery在Postgres未启动时就尝试建立连接。 - DATABASES配置可能未正确引用环境变量:你提供的
settings.py未展示数据库配置部分,如果DATABASES里的HOST硬编码为localhost而非引用DB_HOST环境变量,也会导致连接失败。
解决方案
1. 更新docker-compose.yml的worker服务配置
修改worker服务,添加env_file和depends_on的db依赖:
worker: build: . container_name: celery restart: always command: celery -A yumezo worker -l info volumes: - .:/app env_file: .env depends_on: - redis - db
2. 确保settings.py的DATABASES配置正确引用环境变量
在settings.py中补充或修改数据库配置,使用.env中的变量:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASS'), 'HOST': os.environ.get('DB_HOST'), 'PORT': os.environ.get('DB_PORT'), } }
3. 重启服务验证效果
停止并重新启动所有容器:
docker-compose down docker-compose up --build
这样Celery容器就能正确读取数据库连接参数,通过容器网络连接到db服务的Postgres,而不是尝试连接本地socket。
内容的提问来源于stack exchange,提问作者user23597190
相关产品推荐
相关产品推荐

