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.
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.
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.
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