消费者。无法连接到amqp:/user:**@rabbit1:5672/: 未能解析经纪人主机名。

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

我仔细阅读了非常类似的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。如果有人知道我做错了什么,我会非常感激。

python-3.x docker docker-compose rabbitmq celery
1个回答
0
投票

这里有几件事情。第一,在评论中提到,从你的角度来看,你的 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
© www.soinside.com 2019 - 2024. All rights reserved.