2015-12-08 160 views
2

我經常遇到這個問題,在Docker中創建堆棧。說我有在泊塢窗,compose.yml一個LAMP堆棧:如何知道服務容器是否已準備好連接?

db: 
    image: mysql 
    environment: 
     MYSQL_VARIOUS: things 
web: 
    build: . 
    links: 
     - db 
    ports: 
     - "80" 
    entrypoint: 
     - setup-and-start 

而且setup-and-start腳本是這樣的:

wait_for_mysql && initialize 

如果Web容器已安裝在其上的MySQL客戶端,那麼我就可以輕鬆定義wait_for_mysql

wait_for_mysql() { 
    local timeout=10 
    while sleep 1; do 
     mysql [credentials] -e 'select 1;' && return 0 
     ((--timeout <= 0)) && break 
    done 
    echo 'Failed to initialize mysql within time limit.' >&2 
    return 1 
} 

但是很多容器都沒有客戶端。而不是將其安裝到每個輕量級容器中,是否有一種合理的方法可以在初始化我的應用程序之前檢查mysql是否已啓動並運行?它應該在大多數Docker容器上工作,但不一定是mysql的完美驗證;即使檢查預期的telnet響應也可能是可以接受的(除了telnet在Docker鏡像上也不常見)。

+0

你可以連接運行你的網站的同一個應用程序嗎? - 如果使用RoR,使用rake任務,如果使用php,使用php腳本 - 這肯定會有必要的庫連接到mysql,因爲它需要它們來運行應用程序。 – Michael

+0

@Michael好問題:我應該澄清一下,我正在嘗試提出一些我可以重用的內容,而不用擔心我正在使用哪個特定的Web容器。這就是說,你的建議是一個很好的建議,我可能會回想起來。 – kojiro

+0

mysql有它自己的協議,所以唯一的竅門是捲曲端口並得到一個非常糟糕的mysql返回值,它檢查mysql是否在該端口上偵聽,沒有其他,這不是一個好辦法,但它作品。 – Michael

回答

2

該問題在Docker Compose FAQ中涵蓋。簡答題沒有好的方法,而這是通過設計。雖然這種用例在測試中非常常見,並且對於任何重要系統的小應用程序wait for startup都是反模式。

等待數據庫準備就緒的問題實際上只是一個分佈式系統更大問題的子集。在生產中, 您的數據庫可能隨時無法使用或移動主機。 應用程序需要適應這些類型的故障。

+1

有趣的一點,但通常應用程序是爲服務時的彈性而設計的,而不是在初始化時。 'rake db:setup'(例如)不能被設計成具有足夠的彈性來設置它無法連接的數據庫。 – kojiro

相關問題