2016-08-11 44 views
5

我嘗試新的健康檢查融入我的泊塢窗系統,但我真的不知道如何去做正確的方式:/碼頭工人健康檢查的作曲家文件

的問題是,我的數據庫容器需要更多有時間啓動並初始化數據庫,然後啓動我的主應用程序的容器。 因此:主容器不會正確啓動,導致缺少數據庫連接。 我編寫了一個healthcheck.sh腳本來檢查數據庫容器的連通性,因此主容器在連接可用後開始啓動。但我不知道如何把它正確的Dockerfile和我的搬運工,compose.yml整合

healthcheck.sh是這樣的:

#!bin/bash 
COUNTER=0 
while [[ $COUNTER = 0 ]]; do 
    mysql --host=HOST --user="user" --password="password" --database="databasename" --execute="SELECT 1"; 
    if [[ $? == 1 ]]; then 
    sleep 1 
    echo "Let's sleep again" 
    else 
    COUNTER=1 
    echo "OK, lets go!" 
    fi 
done 

mysql的容器Dockerfile:

FROM repository/mysql-5.6:latest 
MAINTAINER Me 

... some copies, chmod and so on 

VOLUME ["/..."] 

EXPOSE 3306 

CMD [".../run.sh"] 

HEALTHCHECK --interval=1s --timeout=3s CMD ./healthcheck.sh 

泊塢窗,撰寫.yml如:

version: '2' 
services: 
    db: 
    image: db image 
    restart: always 
    dns: 
     - 10. 
    ports: 
     - "${MYSQL_EXTERNAL_PORT}:${MYSQL_INTERNAL_PORT}" 
    environment: 
     TZ: Europe/Berlin 
    data: 
    image: data image 

    main application: 
    image: application image 
    restart: always 
    dns: 
     - 10. 
    ports: 
     - "${..._EXTERNAL_PORT}:${..._INTERNAL_PORT}" 
    environment: 
     TZ: Europe/Berlin 
    volumes: 
     - ${HOST_BACKUP_DIR}:/... 
    volumes_from: 
     - data 
     - db 

我該如何將此健康檢查集成到我的文檔中ker-compose.yml文件工作? 或者有沒有其他的機會推遲我的主容器啓動容器?

THX馬庫斯

回答

2

一般來說你的應用程序應該能夠應付不可用資源,但也有一些情況下啓動時,它是非常方便的一個容器等待另一個是「完全可用」 。 Docker本身並沒有爲你處理,但是有一些方法可以通過使用一些腳本延遲實際的命令來處理資源使用容器中的啓動。

對於需要等待數據庫「完全啓動」的任何容器可以使用postgresql啓動檢查,有一個很好的例子。請參閱在泊塢窗文檔示例代碼:https://docs.docker.com/compose/startup-order/

+0

丹科安德烈亞斯,DAS HAB ICH沃爾überlesen – aTTraX

3

由於碼頭工人,撰寫1.10.0您可以在撰寫文件中指定健康檢查:https://github.com/docker/docker.github.io/blob/master/compose/compose-file.md#healthcheck

它利用https://docs.docker.com/engine/reference/builder/#/healthcheck已introducded與碼頭工人1.12

+2

你如何使用Docker健康檢查來控制容器的啓動順序?如果一個容器由於健康檢查而不健康,那麼其他容器如何讀取該狀態並延遲自己的啓動,直到其依賴的容器健康爲止? –

1

我相信這是類似於Docker Compose wait for container X before starting Y

你的db_image需要支持curl。
要做到這一點,創建自己的db_image爲:

FROM base_image:latest 
RUN apt-get update 
RUN apt-get install -y curl 
EXPOSE 3306 

然後你應該需要的是一個碼頭工人,compose.yml,看起來像這樣:

version: '2' 
services: 
    db: 
    image: db_image 
    restart: always 
    dns: 
     - 10. 
    ports: 
     - "${MYSQL_EXTERNAL_PORT}:${MYSQL_INTERNAL_PORT}" 
    healthcheck: 
     test: ["CMD", "curl", "-f", "http://localhost:${MYSQL_INTERNAL_PORT}"] 
     interval: 30s 
     timeout: 10s 
     retries: 5 
    environment: 
     TZ: Europe/Berlin 
    main_application: 
    image: application_image 
    restart: always 
    depends_on: 
     db: 
     condition: service_healthy 
    links: 
     - db 
    dns: 
     - 10. 
    ports: 
     - "${..._EXTERNAL_PORT}:${..._INTERNAL_PORT}" 
    environment: 
     TZ: Europe/Berlin 
    volumes: 
     - ${HOST_BACKUP_DIR}:/... 
    volumes_from: 
     - data 
     - db