Utiliser docker-composer pour créer des tables dans la base de données postgresql

j'utilise docker-compose pour déployer une application web multicontainer python Flask. J'ai du mal à comprendre comment créer des tables dans la base de données postgresql pendant la compilation, donc je n'ai pas à les ajouter manuellement avec psql.

mon docker-composer.fichier 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"

Je ne veux pas avoir à entrer psql pour entrer:

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

j'apprécierais des conseils sur la façon de créer les tableaux.

18
demandé sur Daerdemandt 2015-10-23 21:28:40

3 réponses

Je ne veux pas avoir à entrer psql pour entrer

vous pouvez simplement utiliser le mécanisme d'initialisation intégré de container:

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

cela permet de s'assurer que votre sql est exécuté après le démarrage correct du serveur DB.

jetez un oeil à leur point d'entrée script. Il fait quelques préparatifs pour démarrer psql correctement et regarde dans /docker-entrypoint-initdb.d/ répertoire pour les fichiers se terminant par .sh, .sql et .sql.gz.

10- dans le nom de fichier est parce que les fichiers sont traités dans L'ordre ASCII. Vous pouvez nommer vos autres fichiers d'initialisation comme 20-create-tables.sql et 30-seed-tables.sql.gz par exemple et assurez-vous qu'ils sont traités dans l'ordre dont vous avez besoin.

notez Aussi que l'invocation de la commande ne pas spécifier la base de données. Gardez cela à l'esprit si vous êtes, disons, en train de migrer vers docker-composez et votre existant .sql les fichiers ne spécifient pas DB non plus.

Vos fichiers seront traitées à premier départ de container au lieu debuild stade. Puisque Docker Compose arrête les images et les reprend ensuite, il n'y a presque aucune différence, mais s'il est crucial pour vous d'initialiser le DB à build étape je suggère toujours d'utiliser la méthode init intégrée en appelant /docker-entrypoint.sh à partir de votre dockerfile et puis nettoyage au /docker-entrypoint-initdb.d/ répertoire.

21
répondu Daerdemandt 2017-02-05 08:18:08

je créerais les tables dans le cadre du processus de construction. Créer un nouveau Dockerfile dans un nouveau répertoire ./database/

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

./database/setup.sh ressemblerait à quelque chose comme ceci:

#!/bin/bash
set -e

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

mettez votre create user, create database, create table sql (et toutes les autres données de fixture) dans un create_fixtures.sql le fichier ./database/ répertoire.

et enfin postgres le service va changer pour utiliser build:

postgres:
    build: ./database/
    ...

Note: parfois vous aurez besoin d'un sleep 5 (ou encore mieux un script pour Poller et attendre le démarrage de postgresql) après le /etc/init.d/postgresql start ligne. D'après mon expérience, soit le script d'initialisation, soit le client psql s'en occupe pour vous, mais je sais que ce n'est pas le cas avec mysql, alors j'ai pensé que je le dirais.

10
répondu dnephin 2017-05-05 13:46:12

cela n'a pas fonctionné pour moi avec L'approche de copie dans Dockerfile. Mais j'ai réussi à gérer mon init.fichier sql en ajoutant:

volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

dans ma composition de docker.yml. initialisation.sql était dans le même catalogue que mon docker-composer.yml. J'ai regardé la solution ici: https://gist.github.com/vrulevskyi/307b08abddc9568cf8f9c1b429c1ab56

1
répondu Victor Di 2018-08-09 05:19:42