docker-compose RabbitMQ与Nodejs接收端同时运行时的错误

首先讲一下背景:

我现在在开发的一个项目,需要运行RabbitMQ和Nodejs接收端(amqplib库),但是在Nodejs接收端运行时,无法连接至RabbitMQ端,经常提示说 connect ECONNREFUSED ,无法连接至RabbitMQ服务器,我在docker-compose.yml文件中明明在Nodejs接收端将RabbitMQ服务器设置为depends_on,即RabbitMQ运行之后Nodejs接收端才会启动,那么为什么还是无法连接呢?

我查找了相关的资料,终于找到了原因

RabbitMQ容器启动后,离服务可用还有一小段时间

Nodejs接收端容器,则是启动后,就开始尝试连接至RabbitMQ服务器,那么中间就会有一个时间差,当Nodejs接收端去连接RabbitMQ服务器,服务无法响应,则会造成无法连接的错误

那么应该如何解决这个问题呢?

找到一个解决方案:wait-for-it,这个库中会增加对IP和端口的监测,只有当某个IP和端口可访问后,才会进行下一步动作,正好解决了以上的关于服务启动的时间差问题

关于写法,可以参考《https://stackoverflow.com/questions/48015477/docker-and-rabbitmq-econnrefused-between-containers

需要在Nodejs接收端中增加wait-for-it.sh文件,还需要在Dockfile中将sh文件加入至镜像中,并且启动的命令是,当RabbitMQ服务已经启动后,再尝试启动Nodejs服务,这样就可以正常的启动了

 

原本以为这个方案是十拿九稳的,在运行的过程中又出现了问题,即在Nodejs接收端,又出现了No such file or directory/usr/bin/env: bash的错误,这是个什么问题???

查找了网上的一些相关问题后,锁定了问题的原因,是因为Windows和Linux文件的编码问题,其中找到一个ELK的docker-compose也是相同的问题《https://github.com/deviantony/docker-elk/issues/36

其中提到了两点,

1、使用Nodepad++替换指定的换行符

2、在docker-compose up -d启动前,使用docker-compose build命令编译一次

 

那好,第一步:将wait-for-it.sh文件使用Nodepad++处理一下

第二步:在docker-compose up -d前面执行docker-compose build一次

最后,在启动容器后,可以看到,在Nodejs接收端,wait-for-it作用后,会过几秒才启动Nodejs接收端

 

方案参考地址:

Docker and Rabbitmq: ECONNREFUSED between containers

docker-compose start kibana failed!--No such file or directory/usr/bin/env: bash

 

 

相关文章