消费者:无法连接到 amqp://user:**@rabbit1:5672//:无法解析代理主机名
consumer: Cannot connect to amqp://user:**@rabbit1:5672//: failed to resolve broker hostname
我仔细阅读了非常相似的 Whosebug 问题并将我的代码更改为现在的代码。我仍然收到 cannot resolve broker hostname
错误。如果我只使用 amqp:user:mypass@locahost:5672
我会得到一个 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 代理,然后手动执行 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
图像,因为您没有向我们展示您的 Dockerfile,并且 (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
我仔细阅读了非常相似的 Whosebug 问题并将我的代码更改为现在的代码。我仍然收到 cannot resolve broker hostname
错误。如果我只使用 amqp:user:mypass@locahost:5672
我会得到一个 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 代理,然后手动执行 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
图像,因为您没有向我们展示您的 Dockerfile,并且 (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