跳至主要内容

8.3 服務間的相依性

不知道大家有沒有發現在 Docker Swarm 的模式下是沒有 depends_on 這個選項的。

這是因為在一個叢集的環境中沒辦法確保所有的服務都等待另一個服務的啟動,這個時候就需要自己撰寫腳本來確保需要的服務已經啟動。

下方為一個確認其他服務的 ShellScript:

#! /bin/sh

# Wait for PostgreSQL
until nc -z -v -w30 "$DB_HOST" 5432
do
echo 'Waiting for PostgreSQL...'
sleep 1
done
echo "PostgreSQL is up and running"

# 此處可以寫上啟動的指令 EX: yarn start; bundle exec puma ...

這邊的 nc 是 Linux 系統中十分好用的 TCP/UDP 網路程式,能夠拿來檢查一些網路的端口是否存在,而上面就是用簡單的迴圈來判斷資料庫是否正在運作,若一直沒有檢查到資料庫的話,就不會執行到最下方的指令來啟動應用程式。

$DB_HOST 則是資料庫 DNS 名稱的環境變數,在 Docker 的世界中我們都會用容器的名稱,或是在 YAML 內的 services 名稱,而我們將環境變數傳入容器內,就可以在執行應用程式前先確認其他服務是否已經啟動。

而有了這個檔案,我們就會在 Dockerfile 內的 CMD 改成執行這個 ShellScript,這樣在 Swarm 模式下也不用擔心應用程式會在其他需要的服務還沒啟動時就優先啟動導致錯誤。