From 21bd4e1bc5c1386dce0a69a95f1a8349d0454593 Mon Sep 17 00:00:00 2001
From: Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
Date: Wed, 8 Dec 2021 08:23:06 +0100
Subject: [PATCH] =?UTF-8?q?Doc=20pour=20cr=C3=A9er/lancer=20une=20bdd=20?=
 =?UTF-8?q?=C3=A0=20partir=20d'un=20dump=20SQL?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .dockerignore      |  1 +
 DUMP.md            | 38 ++++++++++++++++++++++++++++++++
 README.md          | 55 +++++++++++++++++++++++++++-------------------
 docker-compose.yml |  2 +-
 docker/initdb.sh   | 22 +++++++++++--------
 5 files changed, 86 insertions(+), 32 deletions(-)
 create mode 100644 DUMP.md

diff --git a/.dockerignore b/.dockerignore
index 8fce603..ef3c045 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1 +1,2 @@
 data/
+tmp/
diff --git a/DUMP.md b/DUMP.md
new file mode 100644
index 0000000..503666a
--- /dev/null
+++ b/DUMP.md
@@ -0,0 +1,38 @@
+Créer/lancer une bdd à partir d'un dump SQL
+===========================================
+
+- Mettez le fichier de dump SQL dans le répertoire `./tmp/sql` et assurez-vous qu'il a l'extension `.sql`.
+
+- Trouvez dans le dump le nom du user attendu :
+
+```bash
+grep -Ens "OWNER TO" ./tmp/sql/* | head -n 1
+```
+
+- Créez le sous-répertoire `./tmp/sql/admin`  et copiez-y le script de création de la bdd :
+
+```bash
+mkdir -p ./tmp/sql/admin
+cp ./docker/sql/admin/01_create_db_user.sql ./tmp/sql/admin/
+```
+
+- Lancer le container en adaptant `--env SYGAL_USER=ad_sygal` au user trouvé précédemment :
+
+```bash
+docker run \
+--rm \
+--env POSTGRES_USER=postgres \
+--env POSTGRES_PASSWORD=admin \
+--env SYGAL_DB=sygal \
+--env SYGAL_USER=ad_sygal \
+--env SYGAL_PASSWORD=azerty \
+--publish 5432:5432 \
+--volume $PWD/tmp/sql/:/sql \
+--volume $PWD/tmp/db:/var/lib/postgresql/data \
+sygal-db-image
+```
+
+Au 1er lancement, si aucune bdd n'est déjà persistée dans le répertoire `./tmp/db`, les scripts SQL sont exécutés : 
+la bdd est créée.
+Aux lancements suivants, la bdd existe dans le répertoire donc les scripts ne sont pas exécutés.
+Pour que la bdd soit re-créée, il faut supprimer le répertoire `./tmp/db`.
diff --git a/README.md b/README.md
index 9b521a1..6b11a54 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,22 @@
-# SyGAL Database Image
+SyGAL Database Image
+====================
 
 Ce projet est une image Docker rassemblant le nécessaire pour créer (le cas échéant) et de lancer une base de données 
 pour l'application ESUP-SyGAL.
 
 
-## Lancement de la base de données
+Lancement de la base de données
+-------------------------------
+
+### Avec `docker-compose`
+
+Si vous utilisez la commande suivante, le super-utilisateur, le nom de la base de données et de l'utilisateur 
+SyGAL qui seront créés sont spécifiés "en dur" dans le fichier [`docker-compose.yml`](docker-compose.yml)
+(variables d'environnement `POSTGRES_*` et `SYGAL_*`) :
+
+```bash
+docker-compose up
+```
 
 ### Sans `docker-compose`
 
@@ -23,25 +35,23 @@ sygal-db-image
 ```
 
 Remarques :
-- Le montage `$PWD/data/db:/var/lib/postgresql/data` permet de spécifier un répertoire dans lequel sera persistée 
-  la base de données.
-  Si aucune base n'est déjà persistée, le script `/initdb.sh` est lancé automatiquement 
-  au démarrage du container pour lancer les scripts SQL situés dans le répertoire `/sql` :
-  - Pour commencer, ce sont les scripts SQL placés dans le sous-répertoire `admin` qui sont exécutés
-    **avec le super-user identifié par les variables d'environnement `POSTGRES_USER` et `POSTGRES_PASSWORD`**. 
-  - Ce sont ensuite les autres scripts qui sont exécutés avec le user identifié par les variables d'environnement 
-    `SYGAL_USER` et `SYGAL_PASSWORD`.
-- Vous pouvez substituer les scripts SQL par les vôtres en remplaçant le montage dans `/sql` 
-  (exemple : `--volume $PWD/mes/scripts/sql/:/sql`). La présence d'un sous-répertoire `admin` n'est pas obligatoire. 
-
-### Avec `docker-compose`
-
-```bash
-docker-compose up
-```
-
-
-## Utilisation de l'image dans un `docker-compose.yml`
+  - Les variables d'environnement `POSTGRES_*` spécifient le super-utilisateur à créer 
+    (cf. https://registry.hub.docker.com/_/postgres).
+  - Les variables d'environnement `SYGAL_*` spécifient la base de données et l'utilisateur SyGAL à créer.
+  - Le montage `$PWD/data/db:/var/lib/postgresql/data` permet de spécifier un répertoire dans lequel sera persistée 
+    la base de données.
+    Si aucune base n'est déjà persistée, le script `/initdb.sh` est lancé automatiquement 
+    au démarrage du container pour exécuter les scripts SQL situés dans le répertoire `/sql` :
+    - Pour commencer, ce sont les scripts SQL placés dans le sous-répertoire `admin` qui sont exécutés
+      **avec le super-user identifié par les variables d'environnement `POSTGRES_USER` et `POSTGRES_PASSWORD`**. 
+    - Ce sont ensuite les autres scripts qui sont exécutés avec le user identifié par les variables d'environnement 
+      `SYGAL_USER` et `SYGAL_PASSWORD`.
+  - Vous pouvez substituer les scripts SQL par les vôtres en remplaçant le montage dans `/sql` 
+    (exemple : `--volume $PWD/mes/scripts/sql/:/sql`). La présence d'un sous-répertoire `admin` n'est pas obligatoire. 
+
+
+Utilisation de l'image dans un `docker-compose.yml`
+---------------------------------------------------
 
 ```yml
 version: '2.2'
@@ -64,7 +74,8 @@ services:
 ```
 
 
-## Build de l'image
+Build de l'image
+----------------
 
 - Facultatif : vous pouvez éventuellement récupérer les dernières versions des scripts SQL comme ceci :
 
diff --git a/docker-compose.yml b/docker-compose.yml
index 716463a..707f258 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -14,7 +14,7 @@ services:
       SYGAL_USER: ad_sygal
       SYGAL_PASSWORD: azerty
     ports:
-      - 5432:5432
+      - "5432:5432"
     volumes:
       #- ./docker/db/sql/:/sql               # répertoire des scripts de création de la bdd
       - ./data/db:/var/lib/postgresql/data  # répertoire de où la bdd est persistée
diff --git a/docker/initdb.sh b/docker/initdb.sh
index 3ccf930..263e873 100755
--- a/docker/initdb.sh
+++ b/docker/initdb.sh
@@ -1,6 +1,8 @@
 #!/bin/bash
 set -e
 
+SQL_DIR="/sql"
+
 ##
 ## Lancement des scripts SQL présents dans le répertoire `/sql`.
 ##
@@ -15,12 +17,13 @@ unset PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD # précaution
 # Exécution EN TANT QUE SUPER-USER de tous les scripts .sql présents dans le répertoire `/sql/admin`.
 # NB : il est possible de substituer ces scripts par les vôtres grâce à un volume à monter dans `/sql/admin`.
 #
-if [ -d "/sql/admin" ]; then
-  cd /sql/admin
+if [ -d "${SQL_DIR}/admin" ]; then
+  cd ${SQL_DIR}/admin
   export \
-    PGDATABASE=$POSTGRES_DB \
-    PGUSER=$POSTGRES_USER \
-    ON_ERROR_STOP=1
+  PGDATABASE=$POSTGRES_DB \
+  PGUSER=$POSTGRES_USER \
+  PGPASSWORD=$POSTGRES_PASSWORD \
+  ON_ERROR_STOP=1
   for f in *.sql; do
     psql \
       -v "dbname=${SYGAL_DB}" \
@@ -34,11 +37,12 @@ fi
 # Exécution de tous les scripts .sql présents dans le répertoire `/sql`.
 # NB : il est possible de substituer ces scripts par les vôtres grâce à un volume à monter dans `/sql`.
 #
-cd /sql
+cd ${SQL_DIR}
 export \
-  PGDATABASE=$SYGAL_DB \
-  PGUSER=$SYGAL_USER \
-  PGPASSWORD=$SYGAL_PASSWORD
+ON_ERROR_STOP=1 \
+PGDATABASE=$SYGAL_DB \
+PGUSER=$SYGAL_USER \
+PGPASSWORD=$SYGAL_PASSWORD
 for f in *.sql; do
   psql \
     -v "dbuser=${SYGAL_USER}" \
-- 
GitLab