Utiliser docker-composer pour créer des tables dans la base de données postgresql
Je suis en utilisant le panneau-composer pour déployer une multicontainer python Flacon application web. Je vais avoir de la difficulté à comprendre comment créer des tables dans la base de données postgresql lors de la compilation, donc je n'ai pas à les ajouter manuellement avec psql.
Mon menu fixe-composer.fichier yml est:
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 dans psql afin de taper:
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'aimerais avoir des conseils sur la façon de créer les tables.
source d'informationauteur blahblahblah
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement utiliser le conteneur intégré dans l'init mécanisme:
COPY init.sql /docker-entrypoint-initdb.d/10-init.sql
Cela permet de s'assurer que votre sql est exécuté après le serveur de base de données est correctement démarré.
Prendre un coup d'oeil à leur point d'entrée script. Il fait un peu de la préparation de la mise 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 dossiers sont traités dans l'ordre ASCII. Vous pouvez nommer vos autres fichiers d'initialisation comme20-create-tables.sql
et30-seed-tables.sql.gz
par exemple et de vous assurer qu'elles sont traitées dans l'ordre que vous avez besoin.Noter également que l'invocation de la commande ne pas spécifier la base de données. Gardez cela à l'esprit si vous êtes, disons, la migration vers docker-composer et de vos
.sql
fichiers ne spécifiez pas de DB.Vos fichiers seront traités au conteneur d'abord commencer instaed de
build
scène. Depuis le Panneau cesse de Composer des images et reprend ensuite, il n'y a presque pas de différence, mais si il est essentiel pour vous d'init de la DB àbuild
stade, je suggère toujours à l'aide intégrée dans la méthode init en appelant/docker-entrypoint.sh
de votre dockerfile et puis nettoyage au/docker-entrypoint-initdb.d/
répertoire.Je voudrais créer les tables dans le cadre du processus de construction. Créer un nouveau
Dockerfile
dans un nouveau répertoire./database/
./database/setup.sh
ressemblerait à quelque chose comme ceci:Mettre votre utilisateur de créer, de créer une base de données, sql create table (et toutes les autres données de fixture) dans un
create_fixtures.sql
fichier dans le./database/
répertoire.et enfin votre
postgres
service de changement d'utiliserbuild
:Remarque: Parfois, vous aurez besoin d'un
sleep 5
(ou encore mieux, un script de sondage et d'attendre pour postgresql pour commencer), après la/etc/init.d/postgresql start
ligne. Dans mon expérience, soit le script d'initialisation ou de la psql client gère cela pour vous, mais je sais que ce n'est pas le cas avec mysql, j'ai donc pensé que je devais l'appeler.