Celery не может подключится к базе Postgres Docker
столкнулся с проблемой, когда добавлял celery в проект и все в общем шло нормально celery и celery beat работает пока речь не идет о таске с каким либо запросом в бд, при том что сам django с postgres работает отлично имея одни и те же енвы, ошибка и код ниже,решение в интернете не нашел
docker-compose.yaml
version: "3.2"
services:
app:
build:
context: ./app
container_name: app
image: app
restart: always
command: sh -c "python manage.py migrate --noinput && python manage.py collectstatic --noinput && gunicorn app.wsgi:application -c gunicorn.conf.py"
env_file:
- .env
volumes:
- ./app:/app
depends_on:
- db
- redis
expose:
- 8000
networks:
- main
nginx:
image: nginx:1.18.0-alpine
container_name: nginx
restart: always
volumes:
- ./app/logs:/app/logs
- ./app/staticfiles:/app/staticfiles
- ./app/mediafiles:/app/media
- ./configs/nginx/${NGINX_FOLDER}:/etc/nginx/conf.d
- ./configs/nginx/certificates:/etc/nginx/conf.d/certificates
- ./frontend/build:/var/www/html/frontend
depends_on:
- app
networks:
- main
ports:
- "80:80"
- "443:443"
db:
image: postgres:11-alpine
container_name: db
restart: always
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_HOST=${POSTGRES_HOST}
- POSTGRES_PORT=${POSTGRES_PORT}
volumes:
- ./configs/db:/docker-entrypoint-initdb.d
- postgresql_data:/var/lib/postgresql/data/
networks:
- main
redis:
image: "redis"
container_name: "redis"
celery:
build:
context: ./app
command: celery -A app.celery worker -l info
volumes:
- ./app:/app
depends_on:
- db
- redis
celery-beat:
build:
context: ./app
command: celery -A app.celery beat -l info
volumes:
- ./app:/app
depends_on:
- db
- redis
volumes:
postgresql_data:
networks:
main:
celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, shared_task
from celery.schedules import crontab
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')
app = Celery('app')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.beat_schedule = {
'hello': {
'task': 'app.celery.hello',
'schedule': crontab() # выполнять каждую минуту
},
'check_meetings': {
'task': 'meetings.tasks.check_meetings',
'schedule': crontab() # выполнять каждую минуту
}
}
app.autodiscover_tasks()
@shared_task
def hello():
print('Hello, world')
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
.env
POSTGRES_DB=database
POSTGRES_USER=super_user
POSTGRES_PASSWORD=super_password
POSTGRES_HOST=db
POSTGRES_PORT=5432
CELERY_BROKER_URL=redis://redis:6379
CELERY_RESULT_BACKEND=redis://redis:6379
CELERY_ACCEPT_CONTENT=['application/json']
CELERY_RESULT_SERIALIZER='json'
CELERY_TASK_SERIALIZER='json'
Текст ошибки: django.db.utils.OperationalError: could not connect to server: No such file or directory celery_1 | Is the server running locally and accepting celery_1 | connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Ответы (1 шт):
Если приложение действительно работает, то проблема, очевидно в различии конфигураций приложения и celery. Из того, что сразу бросается в глаза:
- контейнер
celeryне добавлен в сетьmain, по-этомуceleryне сможет присоединиться, даже если будет знать адрес БД. - конфигурация из
.envне передается контейнеруcelery(и в частности параметры типаPOSTGRES_HOSTне устанавливаются при запускеcelery), по-этому используются параметры по-умолчанию, иceleryищет БД на локальном хосте т.е. в том же контейнере.
Нужно добавить конфигурацию, как это сделано для приложения:
celery:
....
env_file:
- .env
networks:
- main
