Testdriven.io: The Definitive Guide to Celery and Django. Во всех журналах контейнеров появляется сообщение "Waiting for PostgreSQL to become available...".

Я выполнил все шаги части 1 главы 4 и буквально скопировал код, как показано на рисунке.

docker-compose может создавать контейнеры, но я всегда получаю сообщение Waiting for PostgresSQL to become available, которое регистрируется во всех других контейнерах, как показано ниже. docker-compose logs

Ниже приведен вывод docker ps -a. Из него видно, что все контейнеры запущены на соответствующих портах. docker ps -a logs

Я проверил журналы docker container logs db, и он показывает, что запущен. postgres container logs

Но я не могу открыть сервер Django на порту 8010 и не могу просмотреть сервер цветов на порту 5557, потому что в логах контейнера я получаю сообщение "Waiting for PostgreSQL to become available..."

Кто-нибудь, пожалуйста, помогите. Эта проблема просто убивает меня. Я пытался просмотреть логи каждого контейнера, и он показывает, что запущен, но я не могу просмотреть Django и flower server.

Дайте мне знать, если вам понадобится больше информации.

Спасибо!

Попробовал проверить, запущена ли БД на нужном порту. проверил, запущен ли Redis. проверил логи каждого запущенного контейнера, которые указывают на одно и то же сообщение "Waiting for PostgreSQL to become available..."

Был использован пакет

psycopg2-binary. Использование psycopg2 вместо этого пакета помогло мне. Эта проблема может быть связана с Mac M1

У меня была такая же проблема с этим учебником (на mac M1), и это заняло у меня много часов. Решением для меня стало использование "alpine" вместо "buster", вот мой Dockerfile:

FROM alpine:3.17.1

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

RUN apk update \
    && apk add postgresql-dev gcc python3-dev musl-dev py3-pip bash

# Requirements are installed here to ensure they will be cached.
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

COPY ./compose/local/django/entrypoint /entrypoint
RUN sed -i 's/\r$//g' /entrypoint
RUN chmod +x /entrypoint

COPY ./compose/local/django/start /start
RUN sed -i 's/\r$//g' /start
RUN chmod +x /start

COPY ./compose/local/django/celery/worker/start /start-celeryworker
RUN sed -i 's/\r$//g' /start-celeryworker
RUN chmod +x /start-celeryworker

COPY ./compose/local/django/celery/beat/start /start-celerybeat
RUN sed -i 's/\r$//g' /start-celerybeat
RUN chmod +x /start-celerybeat

COPY ./compose/local/django/celery/flower/start /start-flower
RUN sed -i 's/\r$//g' /start-flower
RUN chmod +x /start-flower

WORKDIR /app

ENTRYPOINT ["/entrypoint"]

requirements.txt:

django==4.1.4
celery==5.2.7
redis==4.3.4
flower==1.2.0
psycopg2-binary==2.9.5

И, возможно, это не связано напрямую, я добавил проверки запуска и здоровья в файл docker compose, так что вам не нужен опрос postgres "ready" в скрипте точки входа.

Вот мой docker-compose.yml:

version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: django_celery_example_web
    command: /start
    volumes:
      - .:/app
    ports:
      - 8010:8000
    env_file:
      - ./.env/.dev-sample
    depends_on:
      redis:
        condition: service_started
      db:
        condition: service_healthy

  db:
    image: postgres:14.6-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_DB=hello_django
      - POSTGRES_USER=hello_django
      - POSTGRES_PASSWORD=hello_django
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U hello_django"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    networks:
      - default

  celery_worker:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: django_celery_example_celery_worker
    command: /start-celeryworker
    volumes:
      - .:/app
    env_file:
      - ./.env/.dev-sample
    networks:
      - default
    depends_on:
      redis:
        condition: service_started
      db:
        condition: service_healthy

  celery_beat:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: django_celery_example_celery_beat
    command: /start-celerybeat
    volumes:
      - .:/app
    env_file:
      - ./.env/.dev-sample
    depends_on:
      redis:
        condition: service_started
      db:
        condition: service_healthy

  flower:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: django_celery_example_celery_flower
    command: /start-flower
    volumes:
      - .:/app
    env_file:
      - ./.env/.dev-sample
    ports:
      - 5557:5555
    depends_on:
      redis:
        condition: service_started
      db:
        condition: service_healthy

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