我經常遇到這個問題,在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鏡像上也不常見)。
你可以連接運行你的網站的同一個應用程序嗎? - 如果使用RoR,使用rake任務,如果使用php,使用php腳本 - 這肯定會有必要的庫連接到mysql,因爲它需要它們來運行應用程序。 – Michael
@Michael好問題:我應該澄清一下,我正在嘗試提出一些我可以重用的內容,而不用擔心我正在使用哪個特定的Web容器。這就是說,你的建議是一個很好的建議,我可能會回想起來。 – kojiro
mysql有它自己的協議,所以唯一的竅門是捲曲端口並得到一個非常糟糕的mysql返回值,它檢查mysql是否在該端口上偵聽,沒有其他,這不是一個好辦法,但它作品。 – Michael