我正在尝试为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 log中的错误消息:
{"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://用户名:密码@ RabbitMQ的:5672
我将link属性添加到docker-compose文件中,并在.env文件(rabbitmq)中引用了该名称。我试图从容器外部运行NewUserNotification.js文件,它开始运行正常。什么可能导致这个问题?连接字符串问题? Docker-Compose.yml配置问题?其他
答案 0 :(得分:2)
似乎环境变量AMQP_RECEIVE_URL
构造不正确。根据错误日志,侦听器正在尝试连接到localhost(127.0.0.1),而localhost(127.0.0.1)不是rabbitmq服务容器IP。找到工作样本的修改配置。
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
在问题中使用相同的文件。
答案 1 :(得分:1)
在从使用服务尝试连接时,您的RabbitMQ服务可能未完全启动。
如果是这种情况,在Docker Compose中,您可以wait
使用名为dadarek/wait-for-dependencies的容器来提供服务。
1)。将新服务waitforrabbit
添加到docker-compose.yml
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在与消费服务建立连接之前完全启动。