2015-10-23 17 views
16

Utilizzo la finestra mobile-compose per distribuire un'applicazione web Python multicontainer. Ho difficoltà a capire come creare tabelle nel database postgresql durante la compilazione, quindi non devo aggiungerle manualmente con psql.Utilizzo di docker-compose per creare tabelle nel database postgresql

Il mio file finestra mobile-compose.yml è:

web: 
    restart: always 
    build: ./web 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - /usr/src/flask-app/static 
    env_file: .env 
    command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app 

nginx: 
    restart: always 
    build: ./nginx/ 
    ports: 
    - "80:80" 
    volumes: 
    - /www/static 
    volumes_from: 
    - web 
    links: 
    - web:web 

data: 
    restart: always 
    image: postgres:latest 
    volumes: 
    - /var/lib/postgresql 
    command: "true" 

postgres: 
    restart: always 
    image: postgres:latest 
    volumes_from: 
    - data 
    ports: 
    - "5432:5432" 

io non voglio avere per entrare psql per inserire:

CREATE DATABASE my_database; 
CREATE USER this_user WITH PASSWORD 'password'; 
GRANT ALL PRIVILEGES ON DATABASE "my_database" to this_user; 
\i create_tables.sql 

Gradirei una guida su come creare il tabelle.

risposta

16

non voglio avere per entrare psql al fine di inserire

Si può semplicemente utilizzare il contenitore del meccanismo incorporato init:

COPY init.sql /docker-entrypoint-initdb.d/10-init.sql

Questo fa in modo che la vostra sql viene eseguito dopo che il server DB è stato avviato correttamente.

Dai un'occhiata al loro punto di congiunzione script. Fa alcuni preparativi per avviare correttamente psql e cerca nella directory /docker-entrypoint-initdb.d/ per i file che terminano con .sh, .sql e .sql.gz.

10- nel nome file è perché i file vengono elaborati in ordine ASCII. Puoi nominare gli altri tuoi file init come 20-create-tables.sql e 30-seed-tables.sql.gz per esempio e assicurarti che vengano elaborati in base alle tue esigenze.

Si noti inoltre che il richiamo del comando does not specifica il database. Tienilo a mente se stai migrando su docker-compose e i tuoi file esistenti .sql non specificano nemmeno DB.

I file verranno elaborati al primo avvio del contenitore instabile di build stage.Poiché Docker Compose arresta le immagini e quindi le riprende, non c'è quasi differenza, ma se è fondamentale iniziare il DB allo stage build, suggerisco comunque di utilizzare il metodo init incorporato chiamando /docker-entrypoint.sh dal file docker e quindi eseguendo la pulizia nella directory /docker-entrypoint-initdb.d/ .

+0

questo non funziona con l'ultima versione dell'immagine postgres :( – dopatraman

9

Vorrei creare le tabelle come parte del processo di compilazione. Creare un nuovo Dockerfile in una nuova directory ./database/

FROM postgres:latest 
COPY . /fixtures 
WORKDIR /fixtures 
RUN /fixtures/setup.sh 

./database/setup.sh sarebbe simile a questa:

#!/bin/bash 
set -e 

/etc/init.d/postgresql start 
psql -f create_fixtures.sql  
/etc/init.d/postgresql stop 

Metti la tua utente di creare, creare database creare tabella SQL (e qualsiasi altro dato fixture) in un create_fixtures.sql nella directory ./database/.

e, infine, il servizio postgres cambierà per usare build:

postgres: 
    build: ./database/ 
    ... 

Nota: A volte avrete bisogno di un (o meglio ancora uno script per il polling e aspettare per PostgreSQL per iniziare) sleep 5 dopo la linea di /etc/init.d/postgresql start . Nella mia esperienza, lo script init o il client psql lo gestisce per te, ma so che non è il caso di mysql, quindi ho pensato di chiamarlo.

+0

Grazie per l'aiuto. Ho riscontrato questo errore durante la creazione di docker-compose.yml. 'bin/sh: 1: /fixtures/setup.sh: Autorizzazione negata Il servizio 'postgres' non è stato compilato: il comando '/ bin/sh -c /fixtures/setup.sh' ha restituito un codice diverso da zero: 126' – blahblahblah

+0

Ok, puoi anche aggiungere 'set -x' all'inizio dello script, in modo che stampi ogni passaggio, e puoi capire dove sta fallendo. – dnephin

+0

Ho aggiunto 'RUN chmod + x/fixtures/setup.sh' che ha risolto il problema. Ora ottengo che non esiste alcun cluster PostgreSQL; vedi "man pg_createcluster" ... (attenzione). psql: impossibile collegarsi al server: Nessun file o directory \t Il server è in esecuzione in locale e accetta le connessioni \t sul socket di dominio Unix "/var/run/postgresql/.s.PGSQL.5432"? Il servizio 'postgres' non è riuscito a compilare: il comando '/ bin/sh -c /fixtures/setup.sh' ha restituito un codice diverso da zero: 2' – blahblahblah

Problemi correlati