标签:tar image connect -- 网上 解决方案 nodejs compose 解决
首先讲一下背景:
我现在在开发的一个项目,需要运行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》
docker-compose RabbitMQ与Nodejs接收端同时运行时的错误
标签:tar image connect -- 网上 解决方案 nodejs compose 解决
原文地址:https://www.cnblogs.com/weschen/p/10253664.html