我正在尝试使用 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
我已尝试以下所有方法,但问题仍然存在:
要使两个容器相互连接,它们必须位于同一 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 基础映像开始。)