2016-05-16 16 views
6

Rozumiem, że przy użyciu starszej wersji funkcji docker-compose możemy utworzyć inny kontener z tylko woluminem danych i połączyć go przy użyciu parametru volume_from, aby utworzyć kontener "tylko do danych". Jednak chciałem przetestować używając nowej składni.W jaki sposób utworzyć dokowanie-skomponować wersję 2, aby mieć trwałość postgres db przy użyciu woluminów?

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 

Zostało to oparte na this post.

mam inny skrypt działa czekać aż ten pojemnik postgres jest się przed pozostałe pojemniki uruchomić na przykład:

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

z skrypt wygląda jak:

#!/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 

ta została podjęta z witryna dokowania.

Prowadzi to tylko do tego, że pojemniki zwalniają i nie pojawiają się w ogóle i nie mogę nawet załadować kontenera PostgreSQL z tabelami, których potrzebuję.

Odpowiedz

8

Wersja 2 nie jest potrzebna do uruchomienia skryptu sprawdzającego, ponieważ postgres rozpocznie słuchanie po uruchomieniu, a do zdefiniowania zależności można użyć depends_on. Oto jak skonfigurować PostgreSQL, wolumin i serwer (glassfish) działający na postgres:

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

Rozumiem! Ale co, jeśli muszę mieć skonfigurowane migracje w mojej aplikacji do kolb przed rozpoczęciem innych kontenerów? W innym skrypcie 'wait-for-flask.sh' wykonuję ' '' aż do psql -h "postgres" -U "postgres" -c "WYBIERZ * Z tego_tablicy; '; do > & 2 echo "Postgres jest niedostępny - spanie" spać 1 zrobione "' " To był jedyny sposób, w jaki udało mi się uruchomić inne pojemniki przed rozpoczęciem migracji w alembiku. Jakiś pomysł, jak mógłbym to przeboleć? –

+1

Ponadto, myślałem, że jak "połączony", "zależy od" nie martwi się o to, czy to się skończyło czy nie, tylko czy to się zaczęło. Na przykład, tylko dba o to, aby kontener PostgreSQL był gotowy, ale nie był gotowy do uruchomienia. Czy to niewłaściwy @waterscar? –

+0

@JosephSong masz rację, że depend_on nie będzie czekać, aż usługa będzie gotowa, więc musisz skrypt, aby to sprawdzić. I musisz umieścić ten skrypt sprawdzający we wszystkich kontenerach aplikacji, które są 'depend_on' w kontenerze PostgreSQL, aby upewnić się, że czeka on na zakończenie migracji. – waterscar