我將一個nginx代理服務和一個rails應用程序服務部署到一個docker swarm中。 nginx取決於我的docker-compose文件中的應用程序。如何讓nginx等待我的上游服務在Docker Swarm中啓動?
我的nginx.conf文件將流量引導到我的上游應用服務(在端口3000上公開),就像這樣(僅顯示上游部分)。
upstream puma {
server app:3000;
}
我的搬運工,撰寫文件看起來像這樣:
version: '3.1'
services:
app:
image: my/rails-app:latest
networks:
- proxy
web:
image: my/nginx:1.11.9-alpine
command: /bin/sh -c "nginx -g 'daemon off;'"
ports:
- "80:80"
depends_on:
- app
networks:
- proxy
networks:
proxy:
external: true
我的主機設置爲羣經理。
這一切都完全正常 - 沒有問題。
然而,即使我有一個取決於我的搬運工,撰寫文件部分 - (?)的應用服務可能不完全由nginx的服務啓動的時間準備,所以當上遊服務配置部分嘗試DNS解析「應用程序:3000」,它似乎沒有找到它完全。所以,當我訪問我的網站,我在nginx的日誌中發現以下錯誤消息:
2017/02/13 10:46:07 [error] 8#8: *6 connect() failed (111: Connection refused) while connecting to upstream, client: 10.255.0.3, server: www.mysite.com, request: "GET/HTTP/1.1", upstream: "http://127.0.53.53:3000/", host: "preprod.local"
如果我殺了正在運行nginx的服務泊塢窗容器,片刻後羣重新安排,並將其返回,如果然後我訪問它的工作原理完全正常,並且該請求成功傳遞到app:3000。
我該如何防止這種情況發生 - 啓動時間有一點點的時候,當nginx啓動的時候它還不能正確解析名爲app:3000的羣集服務 - 而是嘗試將流量傳遞到IP地址....
順便說一句 - 同樣的情況,如果我重新啓動我的虛擬機 - 當泊塢窗(在羣模式)再次提出服務 - 我可以結束了同樣的問題。重新啓動nginx容器解決了這個問題。