Docker, Postgresql et initialisation

May 22, 2017 · 327 words · 2 minutes read docker

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