服务器引导顺序,docker compose 服务启动顺序控制的方法
概要
docker-compose 可以方便組合多個 docker 容器服務, 但是, 當容器服務之間存在依賴關系時, docker-compose 并不能保證服務的啟動順序.
docker-compose 中的 depends_on 配置是容器的啟動順序, 并不是容器中服務的啟動順序.
問題重現
首先, 我們構造一個示例, 來演示 docker-compose 帶來的問題. docker-compose.yml 文件如下:
啟動后, 可以發現, 確實是先啟動 database, 后啟動 web, 但是 database 中的服務是在大約 5 秒后才完成的, 所以導致 web 的啟動失敗.
問題解決方式 1.0
修改 web 的啟動腳本, 等待 database 的端口通了之后再啟動服務
再次啟動,
web 會在 database 啟動完成, 端口通了之后才啟動.
問題解決方式 2.0
上面的解決方式雖然能夠解決問題, 但是在 yaml 中直接插入腳本不好維護, 也容易出錯. 如果有多個依賴, 或者多層依賴的時候, 復雜度會直線上升.
所以, 要封裝一個 entrypoint.sh 腳本, 可以接受啟動命令, 以及需要等待的服務和端口. 腳本內容如下:
這個腳本有 2 個參數, -d 需要等待的服務和端口, -c 等待的服務和端口啟動之后, 自己的啟動命令
修改 docker-compose.yml, 使用 entrypoint.sh 腳本來控制啟動順序.
實際使用中, 也可以將 entrypoint.sh 打包到發布的鏡像之中, 不用通過 volumes 配置來加載 entrypoint.sh 腳本.
測試結果如下:
補充
依賴多個服務和端口
使用上面的 entrypoint.sh 腳本, 也可以依賴多個服務和端口, -d 參數后面的多個服務和端口用逗號(,)隔開.
執行的效果可以自行嘗試.
嘗試間隔的配置
每次嘗試連接的等待時間可以通過 環境變量 SLEEP_SECOND 來配置, 默認 2 秒 下面的配置等待時間設置為 4 秒, 就會每隔 4 秒才去嘗試 mysql 服務時候可連接.
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/wang_yb/p/9400291.html
總結
以上是生活随笔為你收集整理的服务器引导顺序,docker compose 服务启动顺序控制的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014-7-29-阿里电面-第一轮
- 下一篇: Python功能之反射