web-dev-qa-db-ja.com

DockerとRabbitmq:コンテナー間のECONNREFUSED

私は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

Link属性をdocker-composeファイルに追加し、.envファイル(rabbitmq)でその名前を参照しました。 NewUserNotification.jsファイルをコンテナーの外部から実行しようとすると、正常に起動しました。この問題の原因は何ですか?接続文字列の問題? Docker-Compose.yml構成の問題?その他?

9
user1790300

環境変数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

AMQP_RECEIVE_URLを使用してnew_user_notificationを環境変数としてenv_fileサービスに渡し、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

3
Anuruddha

使用しているサービスから接続が試行されたときに、RabbitMQサービスが完全に起動していない可能性があります。

この場合、Docker Composeでは、サービスをwaitdadarek/wait-for-dependencies というコンテナーを使用して起動できます。

1)。docker-compose.ymlに新しいサービスwaitforrabbitを追加します

waitforrabbit:
  image: dadarek/wait-for-dependencies
  depends_on:
    - rabbitmq 
  command: rabbitmq:5672

2)。このサービスを、RabbitMQの起動を必要とするサービスのdepends_onセクションに含めます。

depends_on: 
  - waitforrabbit

3)。スタートアップ構成

docker-compose run --rm waitforrabbit
docker-compose up -d account new_user_notification

この方法で作成を開始すると、消費サービスからの接続が行われる前に、RabbitMQが完全に起動するのを本質的に待機します。

2
grizzthedj