我仔细阅读了非常类似的stackoverflow问题,并把我的代码改成了现在的样子。我仍然得到 cannot resolve broker hostname
错误。如果我只用 amqp:user:mypass@locahost:5672
我得到的是a connection refused
# docker-compoose.yml
version: "3.8"
services:
broker:
image: rabbitmq:3-management-alpine
hostname: rabbit1
environment: &env
RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
RABBITMQ_DEFAULT_USER: "user"
RABBITMQ_DEFAULT_PASS: "password"
RABBITMQ_DEFAULT_VHOST: "/"
CELERY_BROKER_URL: "amqp://user:password@rabbit1:5672"
ports:
- "5672:5672"
- "15672:15672"
expose:
- "5672"
networks:
- webnet
volumes:
- .:/home/user
worker:
build:
context: .
dockerfile: ./worker/Dockerfile
command: ["celery", "worker", "--app=worker.tasks.app", "--loglevel=INFO"]
environment:
<<: *env
links:
- broker
depends_on:
- broker
networks:
- webnet
volumes:
- .:/home/user
networks:
webnet:
# Dockerfile
FROM python:3.7-slim
RUN groupadd user && useradd --create-home --home-dir /home/user -g user user
ENV CELERY_USER = user
WORKDIR /home/user
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
RUN rm requirements.txt
我试过通过docker-compose启动rabbitmq broker,然后手动做一个 celery worker --app=tasks.app
而在设置了 CELERY_BROKER_URL=amqp://user:mypass@localhost:5672
当我把worker和broker放在同一个yaml中时,它就会抛出这个错误。我试过在没有网络的情况下,手动设置Dockerfile中的CELERY_BROKER_URL。如果有人知道我做错了什么,我会非常感激。
这里有几件事情。第一,在评论中提到,从你的角度来看,你的 worker
容器中,你的rabbitmq服务在主机的 broker
所以,你的 CELERY_BROKER_URL
变量应该指向 amqp://user:password@broker:5672
.
第二个问题是rabbitmq需要一段时间来启动。这意味着你最初会看到来自 celery worker
当它第一次启动时,因为它将在rabbitmq准备好之前尝试连接。然而,它会重试直到成功。
我能够用下面的方法让一切正常工作 docker-compose.yml
:
version: "3.3"
services:
broker:
image: rabbitmq:3-management-alpine
hostname: rabbit1
environment: &env
RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
RABBITMQ_DEFAULT_USER: "user"
RABBITMQ_DEFAULT_PASS: "password"
RABBITMQ_DEFAULT_VHOST: "/"
CELERY_BROKER_URL: "amqp://user:password@broker:5672"
ports:
- "5672:5672"
- "15672:15672"
expose:
- "5672"
volumes:
- .:/home/user
worker:
image: celery
command: ["celery", "worker", "-l" "INFO"]
environment:
<<: *env
volumes:
- .:/home/user
这与你的情况非常相似,但(a)我使用的是官方的。celery
映像,因为你没有向我们展示你的Docker文件,而且(b)我已经删除了 links:
键,因为 links
已被废弃,改用现在默认的基于 DNS 的服务发现。哦,还有(c)我去掉了自定义网络,因为如果你正在创建一个单一的网络,你还不如直接使用默认值,即 docker-compose
为你创造。
当我提出这个问题的时候,我最终看到。
broker_1 | 2020-05-11 21:46:10.098 [info] <0.634.0> connection <0.634.0> (172.26.0.3:39372 -> 172.26.0.2:5672): user 'user' authenticated and granted access to vhost '/'
broker_1 | 2020-05-11 21:46:10.111 [info] <0.639.0> accepting AMQP connection <0.639.0> (172.26.0.3:39374 -> 172.26.0.2:5672)
worker_1 | [2020-05-11 21:46:10,100: INFO/MainProcess] Connected to amqp://user:**@broker:5672//
worker_1 | [2020-05-11 21:46:10,115: INFO/MainProcess] mingle: searching for neighbors
worker_1 | [2020-05-11 21:46:11,140: INFO/MainProcess] mingle: all alone