我已经遵循了 testdriven.io 课程的每个步骤:“Celery 和 Django 权威指南”,并且正在学习第 1 部分第 4 章,并逐字复制粘贴代码,如图所示。
docker-compose 能够构建容器,但我总是从所有其他容器记录等待 PostgresSQL 变得可用,如下所示。 docker-compose 日志
以下是 docker ps -a 的输出。从中我可以看到所有容器都在各自的端口中运行。 docker ps -a 日志
我检查了数据库的 docker 容器日志,它显示正在运行。 postgres 容器日志
但是,我无法在端口 8010 上打开 Django 服务器,也无法在端口 5557 上查看 Flower 服务器,因为在容器日志中我收到消息“等待 PostgreSQL 可用...”
请有人帮忙。这个问题快要死我了。我尝试查看每个容器的日志,它显示它正在运行,但我无法查看 Django 和 Flower 服务器。
如果你们需要更多信息,请告诉我。
尝试检查数据库是否已启动并在正确的端口上运行。 检查 Redis 是否正在运行。 检查每个正在运行的容器的日志,该日志指向相同的消息“等待 PostgreSQL 变得可用...”
使用psycopg2-二进制包。 使用 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"]
需求.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: