消费者:无法连接到 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