2014-12-27 59 views
5

對於我的一個家庭項目,我決定使用碼頭集裝箱和無花果進行編排(第一次使用這些工具)。fig up:碼頭集裝箱開始同步

這裏是我的fig.yaml:

rabbitmq: 
    image: dockerfile/rabbitmq:latest 
mongodb: 
    image: mongo 
app: 
    build: . 
    command: python /code/app/main.py 
    links: 
    - rabbitmq 
    - mongodb 
    volumes: 
    - .:/code 

RabbitMQ的開始時間比我的加載應用程序的時間要慢得多。即使rabbitmq容器首先開始加載(因爲它是在應用程序鏈接中),當我的應用程序嘗試連接到rabbitmq服務器時,它還不可用(它肯定會加載計時問題,因爲如果我在連接rabbitmq之前插入睡眠5秒鐘 - 一切工作正常)。有沒有一些標準的方法來解決加載時間同步問題?

謝謝。

我曾經遇到過

回答

6

我不認爲這是解決這個的標準方法,但它是一個已知的問題,有些人可以接受的解決辦法。

a proposal關於不考慮容器的開始,直到它在暴露的端口偵聽的泊塢問題跟蹤。但由於其他問題會造成其他問題,它可能不會被接受。在同一主題上也有fig proposal

簡單的解決方法是做睡眠就像@jcortejoso說。從http://blog.chmouel.com/2014/11/04/avoiding-race-conditions-between-containers-with-docker-and-fig/一個例子:

function check_up() { 
    service=$1 
    host=$2 
    port=$3 

    max=13 # 1 minute 

    counter=1 
    while true;do 
     python -c "import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(('$host', $port))" \ 
     >/dev/null 2>/dev/null && break || \ 
     echo "Waiting that $service on ${host}:${port} is started (sleeping for 5)" 

     if [[ ${counter} == ${max} ]];then 
      echo "Could not connect to ${service} after some time" 
      echo "Investigate locally the logs with fig logs" 
      exit 1 
     fi 

     sleep 5 

     ((counter++)) 
    done 
} 

然後用check_up "DB Server" ${RABBITMQ_PORT_5672_TCP_ADDR} 5672啓動你的應用服務器之前,如上面的鏈接描述。

另一種選擇是使用docker-wait。在你的fig.yml

rabbitmq: 
    image: dockerfile/rabbitmq:latest 
mongodb: 
    image: mongo 
rabbitmqready: 
    image: aanand/wait 
    links: 
    - rabbitmq 
app: 
    build: . 
    command: python /code/app/main.py 
    links: 
    - rabbitmqready 
    - mongodb 
    volumes: 
    - .:/code 
1

類似的問題我已經在我的Dockerfiles使用自定義腳本設置爲CMD解決。然後,您可以運行您希望的任何檢查命令(例如,sleep一段時間,或等待該服務正在監聽)。我認爲沒有一個標準的方法來做到這一點,無論如何,我認爲最好的方式是應用程序運行可以讓外部服務啓動並運行,並連接到它們,但這在大多數情況下是不可能的案例。