如果每個 Rails app 都有呼應本身的 Docker-compose repository,例如 A Rails app 自己本身有 Rails repo 而且也有專屬的 A Docker-compose repo,那麼就要注意 A Docker-compose repo 的目錄架構,小心無法使多個 Rails app 共站。
假設 A Docker-compose repo 因應開發、測試和正式環境而分成不同的 docker-compose.yml
,repo 目錄和檔案架構如下圖:
a-app-docker-repo dir
|
|
|————— dev dir———— docker-compose.yml
|
|————— production dir
|
|
|—————— mac dir ———— docker-compose.yml
|
|—————— ubuntu dir ——— docker-compose.yml
若 B Docker-compose repo 目錄和檔案架構也如同 A docker-compose repo 一樣,當在屬於 production 環境的 ubuntu 機器上讓這兩個 Rails app 共站時,必須注意所使用的 docker-compose 指令所攜帶的參數,如果沒特別指定參數 --project-name
的值,例如:
docker-compose up -d
那麼 docker-compose 會讓 A 、B app 的 網路預設綁在同一個網路下,以上面檔案架構圖為例,兩個 Rails app 所使用的 docker-compose 網路名稱都會是 ubuntu_default
。原因 docker-compose 官方文件 https://docs.docker.com/compose/networking/ 提到:
Note: Your app’s network is given a name based on the “project name”, which is based on the name of the directory it lives in. You can override the project name with either the
--project-name
flag or theCOMPOSE_PROJECT_NAME
environment variable.
若 A 和 B app 各自都有相同服務綁在同一個 port 上面,那麼其中一個 Rails app 的相同服務會自動關閉。 要解決這樣的問題,用 docker-compose 指令啟動每個 Rails app 時,請使用以下範例指令:
docker-compose --project-name a-app up -d
docker-compose --project-name b-app up -d
亦有使用 COMPOSE_PROJECT_NAME
的解決方式,在此不再贅述。