使用 Celery 和 RabbitMQ 对 Django 项目进行 docker 化时出现问题

问题描述 投票:0回答:1

我正在尝试使用 Celery 和 RabbitMQ 对我的 Django 项目进行 dockerize。我有一个 Docker Compose 文件,但我无法让它工作。

这是我的 Docker Compose 文件:

services:
  rabbitmq:
    image: rabbitmq:latest
    networks:
      - main
    ports:
      - "5672:5672"
    restart: always
    environment:
      - RABBITMQ_DEFAULT_USER=guest
      - RABBITMQ_DEFAULT_PASS=guest

  celery_worker:
    image: python:3.10
    command: celery -A zwitter worker -l INFO
    build:
      context: .
    depends_on:
      - app
      - rabbitmq
    environment:
      - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672/
    networks:
      - main
    restart: always

  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - cache:/data
    command: redis-server --save 60 1
    restart: always

  app:
    image: python:3.10
    build: .
    command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/src/
    ports:
      - "8000:8000"

networks:
  main:

volumes:
  cache:

当我尝试启动 Docker Compose 容器时,一切正常,容器全部启动。但是当任何 celery 任务即将在我的 django 项目中运行时,我收到以下错误:

[Errno -3] Temporary failure in name resolution

我已尝试以下所有方法,但问题仍然存在:

  • 确保 RabbitMQ 服务器正在运行且可访问。
  • 确保 Celery Worker 配置为连接到正确的 RabbitMQ 服务器。
  • 检查 Celery 工作容器和 RabbitMQ 服务器之间的网络连接。
django docker docker-compose rabbitmq celery
1个回答
0
投票

要使两个容器相互连接,它们必须位于同一 Docker 网络上。您的两个容器(

rabbitmq
celery_worker
)明确附加到
networks: [main]
,但另外两个(
redis
app
)则没有。对于这两个容器,Compose 创建一个名为
default
的网络并将它们附加到该网络。

最简单的解决方案是从文件中删除 networks: 块中的

all
。 Compose 会将所有容器附加到自动创建的
default
网络。由于它们都位于同一网络上,因此 DNS 解析将按预期工作。

(这可能不是你的问题,但是对于你

build: .
的两个容器,你还应该删除
image: python:3.10
行,然后手动
docker pull python:3.10
一次。如果你同时有
build:
image:
,那么这个设置所构建的映像的名称,这意味着您的映像构建实际上是附加到先前的构建,而不是从干净的 Python 基础映像开始。)

© www.soinside.com 2019 - 2024. All rights reserved.