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》
docker-compose RabbitMQ與Nodejs接收端同時運行時的錯誤