Celery не может подключится к Postgres Django

Проблема заключается в том, что контейнер Celery не может подключится к базе данных Postgres, когда начинает выполнять таску. В чем может быть проблема? При отправке таски выдает такую ошибку - django.db.utils.OperationalError: connection is bad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory. Is the server running locally and accepting connections on that socket?

docker-compose.yml

 version: '3'

services:
  db:
    image: postgres:latest
    container_name: postgres
    restart: always
    env_file:
      .env
    ports:
      - "5432:5432"

  web-app:
    build: .
    container_name: django
    restart: always
    command: >
      sh -c "python manage.py makemigrations &&
      python manage.py migrate &&
      python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    env_file:
      .env
    depends_on:
      - db
      - redis
      - worker

  worker:
    build: .
    container_name: celery
    restart: always
    command: celery -A yumezo worker -l info
    volumes:
      - .:/app
    depends_on:
      - redis

  redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - "6379:6379"

celery.py

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yumezo.settings')
app = Celery('yumezo')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

init.py

from .celery import app as celery_app

__all__ = ['celery_app']

settings.py

CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'

ENV file

POSTGRES_DB = 'yumezo'
POSTGRES_USER = 'katsuyoriiii'
POSTGRES_PASSWORD = 'pass'

DB_HOST = 'db'
DB_NAME = 'yumezo'
DB_USER = 'katsuyoriiii'
DB_PASS = 'pass'
DB_PORT = 5432

tasks.py

from .models import User
from .services import SendEmail

from celery import shared_task

@shared_task
def activate_email_task(user_pk):  
    user = User.objects.get(pk=user_pk)
    send_email = SendEmail(user=user)  
    send_email.send_activate_email()

У Вас контейнер celery билдится из того же самого Dockerfile, что и django, то есть внутри они будут одинаковые. При этом вы для django указываете env файл, а для celery - нет. Вот он и не знает как подключиться к БД, хотя django знает.

Вернуться на верх