1. 程式人生 > >控制docker-compose中服務的啟動順序

控制docker-compose中服務的啟動順序

官方文件:https://docs.docker.com/compose/startup-order/

可以通過depends_on來編排服務之間的依賴關係,但是有一個問題,比如一個web專案,依賴一個數據庫或者依賴一個redis服務,那麼要等到資料庫完全準備好之後,才能讓web服務開始啟動並連線資料庫,docker預設的依賴方式是隻要依賴資料庫服務容器啟動就會啟動web容器,而不 檢查資料庫是否已經準備好。

解決方法一個方面是在連線層面使用自動重連策略,比如mysql jdbc可以有auto reconnect自動重連引數。或者使用下面建議的用一個指令碼(wait-for-it.sh)來探測依賴服務已經完全準備好,或者自己編寫一個health check指令碼來檢測依賴服務的健康狀況來判斷依賴服務是否啟動完成。

You can control the order of service startup with the depends_on option. Compose always starts containers in dependency order, where dependencies are determined by depends_onlinksvolumes_from, and network_mode: "service:...".

However, Compose will not wait until a container is “ready” (whatever that means for your particular application) - only until it’s running. There’s a good reason for this.

The problem of waiting for a database (for example) to be ready is really just a subset of a much larger problem of distributed systems. In production, your database could become unavailable or move hosts at any time. Your application needs to be resilient to these types of failures.

To handle this, your application should attempt to re-establish a connection to the database after a failure. If the application retries the connection, it should eventually be able to connect to the database.

The best solution is to perform this check in your application code, both at startup and whenever a connection is lost for any reason. However, if you don’t need this level of resilience, you can work around the problem with a wrapper script:

  • Use a tool such as wait-for-itdockerize, or sh-compatible wait-for. These are small wrapper scripts which you can include in your application’s image and will poll a given host and port until it’s accepting TCP connections.

    For example, to use wait-for-it.sh or wait-for to wrap your service’s command:

    version: "2"
    services:
      web:
        build: .
        ports:
          - "80:8000"
        depends_on:
          - "db"
        command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
      db:
        image: postgres
    

    Tip: There are limitations to this first solution; e.g., it doesn’t verify when a specific service is really ready. If you add more arguments to the command, you’ll need to use the bash shift command with a loop, as shown in the next example.

  • Alternatively, write your own wrapper script to perform a more application-specific health check. For example, you might want to wait until Postgres is definitely ready to accept commands:

    #!/bin/bash
    # wait-for-postgres.sh
    
    set -e
    
    host="$1"
    shift
    cmd="[email protected]"
    
    until psql -h "$host" -U "postgres" -c '\q'; do
      >&2 echo "Postgres is unavailable - sleeping"
      sleep 1
    done
    
    >&2 echo "Postgres is up - executing command"
    exec $cmd
    

    You can use this as a wrapper script as in the previous example, by setting:

    command: ["./wait-for-postgres.sh", "db", "python", "app.py"]

注意如果你使用wait-for-it.sh指令碼,如果你的基礎映象不包含bash命令(比如alpine映象)需要安裝bash,不然沒法執行wait-for-it.sh指令碼導致容器啟動失敗。

如果Dockerfile的基礎映象用的是alpine相關的基礎映象的話,記得新增如下指令安裝bash:

RUN apk update
RUN apk upgrade
RUN apk add --no-cache bash

相關推薦

控制docker-compose服務啟動順序

官方文件:https://docs.docker.com/compose/startup-order/ 可以通過depends_on來編排服務之間的依賴關係,但是有一個問題,比如一個web專案,依賴一個數據庫或者依賴一個redis服務,那麼要等到資料庫完全準備好之後,才能讓

docker compose 服務啟動順序控制

打包 14. 啟動腳本 維護 tmp mysq ubuntu 題解 ati 概要 docker-compose 可以方便組合多個 docker 容器服務, 但是, 當容器服務之間存在依賴關系時, docker-compose 並不能保證服務的啟動順序. docker-com

控制Docker Compose啟動順序的一個思路

比對 Go 另一個 lB 下一個 生命 IT 官方文檔 ima 起源 守護進程daemon 從守護進程的角度看Docker Compose Docker的解決方案 思路 代碼 結果 起源 Docker Compose提供了一個depends_on參數。 http

docker-compose啟動映象失敗的問題

解決docker-compose啟動映象失敗的問題; 正常的docker run啟動 java:8u111-jdk是java官方映象,如下命令可以成功啟動一個該映象的容器: docker run --name test001 -idt jav

weblogic調整多個服務啟動順序方法

col gic 數字 -s img spa 點擊 logic font 1.在瀏覽器上登錄到weblogic控制臺 2.點擊部署,如圖所示,部署順序,默認是100. 3.點擊鎖定並編輯,進入如下界面,點擊需要修改的服務,如圖中藍色筆所標誌。 4.修改部署順序,如圖所示

docker compose部署服務

docker compose部署服務1 用docker compose部署服務- 需求:假如現在我們手裏有很多容器,每個容器對應每個服務,有nginx容器,redis容器,mysql容器等。現在我們需要批量化的去管理,批量啟動,停止,重啟等操作!當然你會說用shell,可是如何不用shell來完成需求呢,那就

Docker(八)用docker compose部署服務

docker用docker compose部署服務 docker compose可以方便我們快捷高效地管理容器的啟動、停止、重啟等操作,它類似linux下的shell腳本,基於yaml語法,在該文件裏我們可以描述應用的架構,比如用什麽鏡像、數據卷、網絡模式、監聽端口等信息。我們可以在一個compose文件中定

Android系統服務啟動順序

系統服務啟動分為三類 1. startBootstrapServices() 2. startCoreServices() 3. startOtherServices() startBootstrapServices 1. 啟動Installer服務 2. 啟動Activi

Dockerfile,docker-compose部署服務

dockerfile格式 FROM //指定基於哪個基礎映象 格式 FROM 或者 FROM :, 比如 FROM centos FROM centos:latest MAINTAINER //指定作者資訊 格式 MAINTAIN ,比如 MA

使用Dockerfile建立映象,Docker compose部署服務

一、Dockerfile指令簡介 1、FROM指定來源於哪個映象 例如:FROM centos  FROM centos:latest 2、MAINTAINER指定作者資訊 例如:MAINTAINER wyu wyu.com 3、RUN映象操作指令 例如:RUN yu

linux開機服務啟動順序詳解

Linux系統中,系統服務的啟動指令碼一般放在/etc/rc.d/init.d目錄下。不同的開機模式,則分別對應到/etc/rc.d/rc0-6.d目錄下,rc0.d –rd6.d 這七個目錄存放著linux在不同執行級別init.d下指令碼的啟停順序,這幾個目錄下檔案的命

dubbo架構節點啟動順序及資料流轉

Dubbo 節點圖:參考dubbo官網 Provider啟動順序: 1、啟動Container容器,Container是一個web伺服器(provider在伺服器中啟動,需要通過網路協議訪問) 2、Container容器啟動Provider,提供Provider服務

Docker-compose編排微服務順序啟動解決方案

實際專案中遇到的問題,eureka server如果在其他service後啟動,會導致部分service一直無法註冊成功, 參考網上的經驗,原文:https://www.jianshu.com/p/d2f39703bcb5,做下總結: 主要三種方式,其中第一種是無效的,但是很多部落格沒更新。 1. 用到

服務架構 - 解決Docker-Compose服務編排啟動順序問題

核心 info 是否 鏡像 try ports ddr links 服務編排 基於Docker Compose進行服務編排時,一定碰到服務啟動順序的問題,例如:B服務啟動之前,A服務要已經啟動並且可以正常對外服務。 這個啟動順序的問題,Docker Compose本身它是無

docker容器啟動service服務 Failed to get D-Bus connection: Operation not permitted

docker容器中啟動service服務 failed to get d-bus connection: operation not permitted解決方案:啟動時設置參數 --privileged使用該參數,container內的root擁有真正的root權限。否則,container內的root只是

基於HEALTHCHECK的docker-compose順序啟動解決方案

序言:主要是為了解決docker-compose檔案depends-on順序載入並不會等前一個服務啟動完畢的問題。 官方推薦過wait-for-it.sh方案,那個方案對於dockerfile檔案修改較大,我最終沒有使用,有興趣的可以看一下。 一. 修改dockerfil

docker-compose 啟動的進入docker容器

以前不知道docker -compose啟動中的時候卻 不知道怎麼進入容易,常常使用attach進入,導致死在那裡,原來是這樣啊 docker exec -it 名字 /bin/bash 這樣就可

docker-compose 快速啟動wordpress服務

html http dock 使用 docker tab build all nginx deploy : 安裝 docker yum install docker systemctl start docker systemctl enable docker 安裝dock

docker-compose下的java應用啟動順序兩部曲之一:問題分析

在docker-compose編排多個容器時,需要按實際情況控制各容器的啟動順序,本文是《docker-compose下的java應用啟動順序兩部曲》的第一篇,文中會分析啟動順序的重要性,以及啟動順序有問題時會有什麼樣的影響,再給出臨時解決的和官方推薦的兩種解決方案,為下一篇的實戰做好鋪墊。 環境資訊 本次實

docker-compose下的java應用啟動順序兩部曲之二:實戰

上篇回顧 本文是《docker-compose下的java應用啟動順序兩部曲》的終篇,在上一篇《docker-compose下的java應用啟動順序兩部曲之一:問題分析》中,我們以SpringCloud環境下的註冊中心和業務服務為例,展示了docker-compose.yml中depends_on引數的不足