2016-07-13 7 views
0

Hier ist mein einfaches Szenario, Ich habe einen einfach Flask App, die auf diese Weise zu einer Postgres verbinden:Wie initialisiert man eine Datenbank auf einem Datenvolumencontainer?

SQLALCHEMY_DATABASE_URI='postgresql://username:[email protected]:5432/myproj' 

Und ich habe einen einfache docker-compose.yml:

version: '2' 
services: 
    postgres: 
    image: postgres:latest 
    volumes_from: 
     - data 
    environment: 
     POSTGRES_PASSWORD: secretpassword 
     POSTGRES_USER: username 
     POSTGRES_DB: myproj 
    ports: 
     - "5432:5432" 
    web: 
    build: . 
    volumes_from: 
     - app 
    ports: 
     - "5000:5000" 
    depends_on: 
     - postgres 
    data: 
     image: postgres:latest 
     volumes: 
      - /var/lib/postgresql/data 
     command: "true" 
    app: 
     build: . 
     volumes: 
      - .:/myproj 
     command: "true" 

ich zum Mittagessen brauche einen von mir selbst gemacht Kolben-Skript, das die Tabellen für meine App erstellt:

export FLASK_APP='./myproj/__init__.py' 
flask createdbs 

ich habe diese 2-Operation in den Dockerfile von legen mein web Service, aber weil mein Dienst und der postgres Dienst eine depends_on Beziehung haben, ist der postgres db Host während der Bauphase nicht verfügbar.

Irgendwelche Vorschläge auf dem besten Weg, dies zu erreichen? Ich möchte Hacks vermeiden, ich würde lieber einen korrekten Docker-Workflow respektieren.

Antwort

0

Eine Möglichkeit ist es, das „Befehl“ Stichwort zu tun zu verwenden: https://docs.docker.com/compose/compose-file/#/command (siehe auch Einstiegspunkt Stichwort)

web: 
    build: . 
    volumes_from: 
     - app 
    ports: 
     - "5000:5000" 
    depends_on: 
     - postgres 
    command: "export FLASK_APP='./myproj/__init__.py' && flask createdbs" 

oder mit dem Befehl nur Ihren Kolben-Skript zu starten und Ihren Export läßt in Ihrem Dockerdatei.

Beachten Sie, dass "depends_on" nur einen Container vor dem anderen startet, aber warten Sie nicht, dass Ihre Postgres-Datenbank fertig ist. Wenn Sie warten möchten, bis Postgres bereit ist zu antworten, können Sie Skripte wie "wait-for-it.sh postgres: 5432" verwenden, die in docker-compose doc: https://docs.docker.com/compose/startup-order/

gut erklärt werden