1. 程式人生 > >docker-compose RabbitMQ與Nodejs接收端同時運行時的錯誤

docker-compose RabbitMQ與Nodejs接收端同時運行時的錯誤

原本 depends issue 編譯 出現 動作 替換 tar ons

首先講一下背景:

我現在在開發的一個項目,需要運行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接收端同時運行時的錯誤