我在将一个运行NodeJS的Docker容器连接到另一个运行RabbitMQ的Docker容器时遇到了问题。
我在谷歌上搜索了一下,四处看了看,但没有看到任何专门针对我遇到的问题的东西。我不确定这是我错过的愚蠢的东西还是其他东西。
为了从NodeJS连接,首先我尝试只使用ampqlib库。这会给我一个从NodeJS拒绝的连接。所以我尝试寻找其他替代方法,并找到了Rascal。它是ampqlib
的 Package 器。我看到了同样的错误:
Error: connect ECONNREFUSED 192.XXX.XXX.X:5672
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1195:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '192.XXX.XXX.X',
port: 5672,
broker: Symbol()
}
NodeJS中用于连接的连接字符串:amqp://${process.env.RABBITMQ_DEFAULT_USER}:${process.env.RABBITMQ_DEFAULT_PASS}@${process.env.RABBITMQ_DEFAULT_HOST}:${process.env.RABBITMQ_DEFAULT_PORT}
;HOST
是RABBITMQ_DEFAULT_HOST=rabbitmq
,正如我在下面的docker-compose
中所设置的。
这些都是从我检查过的.env
文件中拉入的,NodeJS应用程序可以很好地读取它们。
到目前为止,我已测试的项目包括:
1.我可以看到rabbitmq容器正在运行并准备好在端口5672
上进行连接:
2022-05-27 15:16:06.422648+00:00 [info] <0.680.0> Ready to start client connection listeners
2022-05-27 15:16:06.429403+00:00 [info] <0.825.0> started TCP listener on [::]:5672
completed with 4 plugins.
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0> Server startup complete; 4 plugins started.
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0> * rabbitmq_prometheus
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0> * rabbitmq_management
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0> * rabbitmq_web_dispatch
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0> * rabbitmq_management_agent
1.我可以通过web浏览器在端口15672
上使用我通过env变量设置的自定义用户/通行证访问RabbitMQ管理UI。我必须配置NGINX反向代理,但它工作正常。
1.相关片段的docker-compose
如下所示:
#################
### rabbit mq ###
#################
rabbitmq:
hostname: rabbitmq
container_name: rabbitmq
image: rabbitmq:management
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
RABBITMQ_DEFAULT_HOST: ${RABBITMQ_DEFAULT_HOST}
ports:
# AMQP protocol port
- '5672:5672'
# HTTP management UI
- '15672:15672'
######################
### nodejs-client ####
######################
api-client:
container_name: api-client
restart: unless-stopped
build: ./packages/market/api-client
env_file:
- ./packages/market/api-client/.env
depends_on:
- rabbitmq
- api
links:
- rabbitmq
- api
1.确保用户名/密码没有任何奇怪的字符,可以打破字符串,所以只是使用像测试:测试,但仍然没有运气。
如果任何人以前遇到过这个问题,或者有任何想法或建议,我将非常感激,因为我被难住了!谢谢
1.我没有配置任何Docker网络,除了默认的网络。当我执行docker network inspect app_default
时,我可以看到为该网络列出的rabbitmq
和api-client
容器。
1条答案
按热度按时间kfgdxczn1#
我想通了问题所在:我需要让NodeJS应用程序在尝试连接到RabbitMQ容器之前等待一段时间。我放了一个X1M0N1X等待几分钟,它能够成功连接。
我不知道有什么更好的方法来等待。我以前试过
wait-for-it
,也许我会写一个定制的bash脚本,专门针对我的设置,只在一段时间后启动NodeJS容器。