2016-05-16 21 views
6

我知道使用docker-compose的舊版本,我們可以創建另一個只有數據卷的容器,並使用volumes_from將其鏈接爲「僅數據容器」。不過,我想用新的語法進行測試。如何創建docker-compose版本2以使用卷具有持久性postgres數據庫?

version: '2' 
services: 
    app: 
     build: . 
     links: 
      - psql 
    psql: 
     image: postgres 
     volumes_from: 
      - psqldata 
     ports: 
      - "5432:5432" 
    psqldata: 
     image: postgres 
     volumes: 
      - psqlvolumes:/var/lib/postgresql/data/ 

volumes: 
    psqlvolumes: 
     driver: local 

這是基於this post

我有另一個腳本運行要等到Postgres的容器了其他容器,例如運行之前:

container: 
    build: . 
    volumes: 
     - ./scripts/wait-for-postgres.sh:/code/wait-for-postgres.sh 
    entrypoint: ./wait-for-postgres.sh "command" 

與腳本看起來像:

#!/bin/bash 

set -e 
export PGPASSWORD=postgres 
cmd="[email protected]" 

until psql -h "postgres" -U "postgres" -c '\l'; do 
    >&2 echo "Postgres is unavailable - sleeping" 
    sleep 1 
done 

>&2 echo "Postgres is up - executing command" 
exec $cmd 

這從拍攝碼頭網站。

這隻會導致容器停滯不前,根本無法獲得postgres容器來初始化我需要的表。

回答

8

運行檢查腳本不需要版本2,因爲postgres一旦啓動就會開始監聽,您可以使用depends_on來定義依賴關係。以下是我如何設置在postgres上運行的postgres,卷和服務器(glassfish):

version: '2' 

services: 
    my-app: 
    image: my-glassfish-image 
    depends_on: 
     - my-db 

    my-db: 
    image: my-postgres-image 
    volumes: 
     - postgres-db-volume:/data/postgres 

volumes: 
    postgres-db-volume: 
+0

我明白了!但是如果在我想啓動其他容器之前需要在我的燒瓶應用上設置遷移,該怎麼辦?在另一個腳本'wait-for-flask.sh'中我做了 '''直到psql -h「postgres」-U「postgres」-c'SELECT * FROM this_table;';做 >&2回聲「的Postgres是不可用的 - 睡覺」 睡眠1 done''' 這一直是我已經能夠運行讓我的其他容器遷移在蒸餾器之前完成的唯一途徑。任何想法如何我能夠克服這一點? –

+1

另外,我認爲像「鏈接」,「依賴」並不真正擔心它是否漲起,就好像它的開始。例如,它只關心postgres容器已啓動但尚未準備好啓動。那是錯的@waterscar? –

+0

@JosephSong你說得對,depends_on不會等到服務準備就緒,所以你需要腳本來檢查它。你需要把這個檢查腳本放到所有'depends_on' postgres容器的應用程序容器中,以確保它等到遷移完成。 – waterscar

相關問題