Docker, Postgresql et initialisation
May 22, 2017 · 327 words · 2 minutes read
Qui n’a pas eu besoin un jour ou un autre d’une base de données déjà initialisée ?
Personnellement, depuis que j’ai découvert docker, je n’installe plus de serveur de base de donnée sur mon poste, je passe par un container. Ce qui me permets d’isoler mes données. Mais un problème que j’avais était d’initialiser mes données à la création de l’image.
Voici un exemple initialisant une base Postgresql à la construction de l’image, c’est à dire créant la structure et initilisant les tables avec des données injectées.
Le principe est simple, il s’agit de copier les fichiers d’initialisation de la base de donnée dans le repertoire d’init de l’image Postgresql.
Tout se passe dans le fichier Dockerfile
:
Tous mes fichiers d’initialisation se trouvent dans le sous répertoire sql
, ce qu’il faut savoir, c’est que le processus d’initialisation de postgresql va les interpreter dans l’ordre alphabétique, donc voici ma structure :
Nom | contenu |
---|---|
00_initialization.sql | Initialisation de la base (schéma, autorisation, ect) |
10_structure.sql | Structure de la base (table, trigger, etc…) |
Le reste des fichiers (20_regions.sql
, 25_districts.sql
, 30_cities.sql
) contiennent les scripts d’insertion des données (en l’occurence, la liste des régions, département et leur chef-lieu et autres ville d’importance).
Vous pouvez trouver les sources de cet exemple dans mon repository bitbucket (autre exemple plus complet et plus recent pour vos tests sur mon repository bitbucket).
Pour tester cet exemple, lancez le fichier docher-compose
se trouvant la racine :
docker-compose -f docker-compose.postgres.yml up
Ensuite vous pourrez vous connecter à la base ainsi initialisée via pgAdmin (par exemple)
champs | valeur |
---|---|
host | localhost |
port | 5432 |
Maintenance database | postgresdb |
User name | postgres |
password | postgres |
Cependant, cela doit rester dans le cadre de vos tests, gardez à l’esprit que les opération I/O au niveau d’un container ne sont pas la solution. Et surtout si vous basculer pour une solution comme celle-ci autrement que pour vos tests, pensez à déclarer un volume externe à votre container pour y stocker le filesystem de postgreSQL.
Enjoy it !!