node.js - Docker 和 Rabbitmq : ECONNREFUSED between containers

标签 node.js docker docker-compose seneca

我正在尝试为 rabbitmq 和容器的消费者设置单独的 docker 容器,即监听队列并执行必要任务的进程。我创建了 yml 文件和 docker 文件。

我能够运行 yml 文件,但是当我检查 docker-compose 日志时,我看到哪里有 ECONNREFUSED 错误。

NewUserNotification.js:

require('seneca')()
    .use('seneca-amqp-transport')
    .add('action:new_user_notification’, function(message, done) {
        … 

        return done(null, {
        pid: process.pid,
        status: `Process ${process.pid} status: OK`
    })
    .listen({
        type: 'amqp',
        pin: ['action:new_user_notification’],
        name: 'seneca.new_user_notification.queue',
        url: process.env.AMQP_RECEIVE_URL,
        timeout: 99999
    });

docker-compose 日志中的错误消息:

    {"notice":"seneca: Action hook:listen,role:transport,type:amqp failed: connect ECONNREFUSED 127.0.0.1:5672.","code":
    "act_execute","err":{"cause":{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1",
    "port":5672},"isOperational":true,"errno":"ECONNREFUSED","code":"act_execute","syscall":"connect","address":"127.0.0.1",
    "port":5672,"eraro":true,"orig":{"cause":{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1",
    "port":5672},"isOperational":true,"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":5672},
    "seneca":true,"package":"seneca","msg":"seneca: Action hook:listen,role:transport,type:amqp failed: connect ECONNREFUSED 127.0.0.1:5672.",
    "details":{"message":"connect ECONNREFUSED 127.0.0.1:5672","pattern":"hook:listen,role:transport,type:amqp","instance":"Seneca/…………/…………/1/3.4.3/-“,
    ”orig$":{"cause":{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":5672},"isOperational":true,
"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":5672}

示例 docker-compose.yml 文件:

version: '2.1'
services:
 rabbitmq:
    container_name: "4340_rabbitmq"
    tty: true
    image: rabbitmq:management
    ports:
      - 15672:15672
      - 15671:15671
      - 5672:5672
    volumes:
      - /rabbitmq/lib:/var/lib/rabbitmq
      - /rabbitmq/log:/var/log/rabbitmq
      - /rabbitmq/conf:/etc/rabbitmq/
account:
    container_name: "account"
    build:
      context: .
      dockerfile: ./Account/Dockerfile
    ports:
      - 3000:3000
    links:
      - "mongo"
      - "rabbitmq"
    depends_on:
      - "mongo"
      - "rabbitmq"
new_user_notification:
    container_name: "app_new_user_notification"
    build:
      context: .
      dockerfile: ./Account/dev.newusernotification.Dockerfile
    links:
      - "mongo"
      - "rabbitmq"
    depends_on:
      - "mongo"
      - "rabbitmq"
    command: ["./wait-for-it.sh", "rabbitmq:5672", "-t", "90", "--", "node", “newusernotification.js"]

amqp 连接字符串: (我尝试了两种方式,有和没有用户/通行证) amqp://username:password@rabbitmq:5672

我在 docker-compose 文件中添加了链接属性,并在 .env 文件(rabbitmq)中引用了该名称。我尝试从容器外部运行 NewUserNotification.js 文件,它开始正常。什么可能导致这个问题?连接字符串问题? Docker-Compose.yml 配置问题?其他?

最佳答案

似乎环境变量 AMQP_RECEIVE_URL 构造不正确。根据错误日志,监听器正在尝试连接到不是 rabbitmq 服务容器 IP 的 localhost(127.0.0.1)。查找工作示例的修改配置。

1 docker-compose.yml

version: '2.1'
services:
 rabbitmq:
    container_name: "4340_rabbitmq"
    tty: true
    image: rabbitmq:management
    ports:
      - 15672:15672
      - 15671:15671
      - 5672:5672
    volumes:
      - ./rabbitmq/lib:/var/lib/rabbitmq
 new_user_notification:
    container_name: "app_new_user_notification"
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - ./un.env
    links:
      - rabbitmq
    depends_on:
      - rabbitmq
    command: ["./wait-for-it.sh", "rabbitmq:5672", "-t", "120", "--", "node", "newusernotification.js"]

2 un.env

AMQP_RECEIVE_URL=amqp://guest:guest@rabbitmq:5672

请注意,我已使用 env_fileAMQP_RECEIVE_URL 作为环境变量传递给 new_user_notification 服务,并删除了 account 服务

3 Dockerfile

FROM node:7
WORKDIR /app
COPY newusernotification.js /app
COPY wait-for-it.sh /app
RUN npm install --save seneca
RUN npm install --save seneca-amqp-transport

4 newusernotification.js 在问题中使用相同的文件。

5 wait-for-it.sh

关于node.js - Docker 和 Rabbitmq : ECONNREFUSED between containers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48015477/

相关文章:

javascript - nodejs中zip的多线程

node.js - 如何销毁客户端 session 中的 session

postgresql - 等待 Docker 容器准备就绪

docker - Nextjs v.10 getstaticprops "revalidate"停止在 docker 容器上工作

docker - 写入共享卷 docker

docker - 撰写文件 './docker-compose.yaml'无效,原因是:服务不支持的配置: 'pihole'

docker-compose - 正则表达式如何匹配不包含固定字符串的子字符串。 Traefik 中的正则表达式

c++ - mac 上的 node-gyp 构建错误 "calling a protected constructor of class ' v8::HandleScope'"

node.js - AWS Cognito Migrate 用户 Node.js Lambda 函数已调用但未按预期运行

django - 使用 Gunicorn 在 Docker 中使用 Django 开发自动重新加载代码更改