Faire fonctionner MariaDB
Configurer le runtime, les secrets et l’initialisation de la base.
Dans ce chapitre : 8 étapes et 32 preuves de validation.
Étape 37 — Écrire les variables non secrètes de MariaDB
Section intitulée « Étape 37 — Écrire les variables non secrètes de MariaDB »Objectif. MariaDB recevra le nom de la base et de l’utilisateur sans les coder dans l’image.
État du projet avant cette étape. Compose sait construire l’image, mais le service ne connaît encore aucun réglage d’exécution.
Comprendre le changement
Section intitulée « Comprendre le changement »srcs/.env contient des valeurs de configuration lisibles : login, nom de base et nom d’utilisateur. Les mots de passe n’y vont pas ; ils restent dans secrets/.
Faire une seule chose
Section intitulée « Faire une seule chose »Écris les trois lignes proposées en remplaçant votrelogin. Ces valeurs seront chargées dans le container à l’étape 29.
Fichiers ou emplacements concernés
srcs/.env
LOGIN=votrelogin
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_userCe que fait chaque partie
- LOGIN servira aux chemins de volumes.
- MYSQL_DATABASE est le nom de la base WordPress.
- MYSQL_USER est le compte utilisé par WordPress.
- Aucune ligne ne contient un mot de passe.
Le fichier contient trois lignes non confidentielles.
Si cela échoue
N’ajoute pas PASSWORD ici ; les mots de passe vont dans secrets/.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.
Étape 38 — Remplir les deux secrets MariaDB
Section intitulée « Étape 38 — Remplir les deux secrets MariaDB »Objectif. Deux mots de passe locaux seront prêts sans apparaître dans Git.
État du projet avant cette étape. Les fichiers secrets existent mais sont encore vides.
Comprendre le changement
Section intitulée « Comprendre le changement »db_password est le mot de passe du compte utilisé par WordPress. db_root_password protège le compte root de MariaDB. Ils doivent être différents et rester uniquement sur la VM.
Faire une seule chose
Section intitulée « Faire une seule chose »Ouvre chaque fichier avec ton éditeur dans la VM et saisis une valeur forte. Ne copie pas la valeur dans le terminal, le Dockerfile, .env ou ce guide. Ferme ensuite les permissions avec chmod.
Fichiers ou emplacements concernés
secrets/db_password.txtsecrets/db_root_password.txt
chmod 700 secrets
chmod 600 secrets/*.txt
git status --short --ignoredCe que fait chaque partie
- chmod 700 limite l’accès au dossier.
- chmod 600 limite chaque fichier à son propriétaire.
- git status --ignored confirme que secrets est ignoré sans afficher les valeurs.
Les fichiers sont ignorés et aucune valeur n’est imprimée.
Si cela échoue
Si secrets apparaît comme fichier suivi, arrête-toi : .gitignore doit être corrigé avant tout commit.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.
Étape 39 — Faire lire les secrets au script
Section intitulée « Étape 39 — Faire lire les secrets au script »Objectif. L’entrypoint pourra récupérer les mots de passe au démarrage du container.
État du projet avant cette étape. Le script provisoire ne lit encore aucune configuration.
Comprendre le changement
Section intitulée « Comprendre le changement »Compose montera chaque secret comme un petit fichier sous /run/secrets. Le script reçoit le chemin dans une variable se terminant par _FILE, puis lit le contenu avec cat.
Faire une seule chose
Section intitulée « Faire une seule chose »Remplace le contenu provisoire de l’entrypoint par la première partie proposée. Ne démarre toujours pas MariaDB : on complète d’abord l’initialisation.
Fichiers ou emplacements concernés
srcs/requirements/mariadb/tools/entrypoint.sh
#!/bin/sh
set -eu
: "${MYSQL_DATABASE:?MYSQL_DATABASE manquant}"
: "${MYSQL_USER:?MYSQL_USER manquant}"
: "${MYSQL_PASSWORD_FILE:?MYSQL_PASSWORD_FILE manquant}"
: "${MYSQL_ROOT_PASSWORD_FILE:?MYSQL_ROOT_PASSWORD_FILE manquant}"
MYSQL_PASSWORD="$(cat "$MYSQL_PASSWORD_FILE")"
MYSQL_ROOT_PASSWORD="$(cat "$MYSQL_ROOT_PASSWORD_FILE")"
test -n "$MYSQL_PASSWORD"
test -n "$MYSQL_ROOT_PASSWORD"Ce que fait chaque partie
- set -eu : arrête sur erreur et variable non définie.
- : "${VAR:?…}" : échoue avec un message précis si une variable manque.
- $(cat …) : lit le contenu du secret monté au runtime.
- test -n : refuse un secret vide.
Un secret absent ou vide arrête immédiatement le container avec une erreur lisible.
Si cela échoue
Si cat indique no such file, comparez le nom du secret Compose et le chemin *_FILE. N’affichez jamais les valeurs dans les logs.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.
Étape 40 — Initialiser un dossier de base vide
Section intitulée « Étape 40 — Initialiser un dossier de base vide »Objectif. Le premier démarrage préparera MariaDB ; les suivants conserveront ce qui existe.
État du projet avant cette étape. Le script connaît les variables mais /var/lib/mysql peut encore être vide.
Comprendre le changement
Section intitulée « Comprendre le changement »mariadb-install-db crée les tables internes nécessaires au serveur. Le test [ ! -d /var/lib/mysql/mysql ] évite de recommencer si ces tables sont déjà présentes.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute ce bloc après la lecture des secrets. Lis le if comme une phrase : « si le dossier système mysql n’existe pas, initialise ; sinon, ne touche pas aux données ».
Fichiers ou emplacements concernés
srcs/requirements/mariadb/tools/entrypoint.sh
mkdir -p /run/mysqld /var/lib/mysql
chown -R mysql:mysql /run/mysqld /var/lib/mysql
if [ ! -d /var/lib/mysql/mysql ]; then
mariadb-install-db --user=mysql --datadir=/var/lib/mysql
FIRST_START=1
else
FIRST_START=0
fiCe que fait chaque partie
- mkdir/chown : prépare socket et datadir pour l’utilisateur mysql.
- test -d : détecte les tables système persistantes.
- mariadb-install-db : initialise uniquement un datadir vide.
- FIRST_START : mémorise si la création métier est nécessaire.
Au premier lancement, les tables système sont créées ; aux suivants, elles sont conservées.
Si cela échoue
Si permission denied vise /var/lib/mysql, inspectez le propriétaire réel du volume. Ne supprimez pas le volume pour masquer l’erreur si vous testez la persistance.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.
Étape 41 — Créer la base et le compte WordPress
Section intitulée « Étape 41 — Créer la base et le compte WordPress »Objectif. Le premier démarrage créera exactement les objets dont WordPress aura besoin.
État du projet avant cette étape. MariaDB peut créer ses tables internes, mais la base wordpress et le compte wp_user n’existent pas encore.
Comprendre le changement
Section intitulée « Comprendre le changement »Le script lance brièvement MariaDB sans réseau, attend au maximum 30 secondes, exécute le SQL de création, puis arrête cette instance temporaire. Cette opération n’a lieu que lors de FIRST_START.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute le bloc SQL proposé. Repère les trois actions : CREATE DATABASE, CREATE USER, GRANT. WordPress utilisera ce compte limité, pas root.
Fichiers ou emplacements concernés
srcs/requirements/mariadb/tools/entrypoint.sh
if [ "$FIRST_START" -eq 1 ]; then
mariadbd --user=mysql --skip-networking --socket=/run/mysqld/mysqld.sock &
temp_pid=$!
ready=0
for attempt in $(seq 1 30); do
if mariadb-admin --socket=/run/mysqld/mysqld.sock ping --silent; then
ready=1
break
fi
sleep 1
done
[ "$ready" -eq 1 ] || { kill "$temp_pid"; echo "MariaDB init timeout" >&2; exit 1; }
mariadb --socket=/run/mysqld/mysqld.sock -uroot <<EOSQL
CREATE DATABASE IF NOT EXISTS `${MYSQL_DATABASE}`;
CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASSWORD}';
GRANT ALL PRIVILEGES ON `${MYSQL_DATABASE}`.* TO '${MYSQL_USER}'@'%';
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
FLUSH PRIVILEGES;
EOSQL
mariadb-admin --socket=/run/mysqld/mysqld.sock -uroot -p"$MYSQL_ROOT_PASSWORD" shutdown
wait "$temp_pid"
fiCe que fait chaque partie
- --skip-networking : empêche toute connexion réseau pendant le bootstrap.
- for … seq 1 30 : attente bornée, pas une boucle infinie.
- CREATE DATABASE/USER : crée l’espace et l’identité WordPress.
- GRANT : limite les droits à la seule base WordPress.
- shutdown/wait : ferme proprement l’instance temporaire.
La base et l’utilisateur sont créés une seule fois, sans loguer les mots de passe.
Si cela échoue
Les quotes dans un secret nécessitent un échappement SQL robuste. Validez et échappez les entrées ; ne les concaténez jamais depuis une entrée non maîtrisée.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.
Étape 42 — Lancer le vrai serveur MariaDB
Section intitulée « Étape 42 — Lancer le vrai serveur MariaDB »Objectif. Le container restera vivant parce que MariaDB tourne, pas grâce à une commande factice.
État du projet avant cette étape. L’initialisation est complète. Il manque la commande finale du script.
Comprendre le changement
Section intitulée « Comprendre le changement »exec remplace le shell par mariadbd. –console garde le serveur au premier plan. Docker voit alors le vrai processus, lui envoie les signaux d’arrêt et détecte un crash.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute la dernière ligne. Le script MariaDB est maintenant complet. Reconstruis l’image pour que cette nouvelle version entre dans l’image.
Fichiers ou emplacements concernés
srcs/requirements/mariadb/tools/entrypoint.sh
exec mariadbd --user=mysql --consoleCe que fait chaque partie
- exec : remplace le shell par MariaDB.
- --user=mysql : abandonne les privilèges root.
- --console : garde le serveur au premier plan et envoie les logs à Docker.
docker top mariadb montre mariadbd comme processus principal.
Si cela échoue
Si le container sort, lisez docker compose logs mariadb ; n’ajoutez pas tail -f.
docker compose -f srcs/docker-compose.yml build mariadbCe que fait chaque partie
- Compose reconstruit l’image afin d’y copier le script final.
Le build se termine et remplace mariadb:inception.
Si cela échoue
Si le script n’est pas exécutable, relance chmod +x puis le build.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.
Étape 43 — Relier la configuration runtime dans Compose
Section intitulée « Étape 43 — Relier la configuration runtime dans Compose »Objectif. Compose donnera à MariaDB son .env, ses deux secrets et sa politique de redémarrage.
État du projet avant cette étape. L’image est complète, mais le service Compose ne monte encore aucun secret et ne charge aucune variable.
Comprendre le changement
Section intitulée « Comprendre le changement »env_file injecte les valeurs de srcs/.env. environment donne au script les chemins des secrets. secrets autorise leurs montages. restart demande à Docker de relancer le container après un crash.
Faire une seule chose
Section intitulée « Faire une seule chose »Complète le service mariadb sans ajouter encore de volume ni de réseau. Ajoute aussi la section secrets au niveau global, tout à gauche du fichier.
Fichiers ou emplacements concernés
srcs/docker-compose.yml
services:
mariadb:
image: mariadb:inception
build:
context: ./requirements/mariadb
dockerfile: Dockerfile
env_file: .env
environment:
MYSQL_PASSWORD_FILE: /run/secrets/db_password
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_password
- db_root_password
restart: unless-stopped
secrets:
db_password:
file: ../secrets/db_password.txt
db_root_password:
file: ../secrets/db_root_password.txtCe que fait chaque partie
- env_file charge les variables non secrètes.
- environment transmet les chemins attendus.
- secrets du service monte les fichiers autorisés.
- secrets global indique les sources locales.
- restart relance après un crash.
Compose décrit toujours un seul service, maintenant prêt à recevoir ses valeurs runtime.
Si cela échoue
Utilise docker compose config après chaque changement d’indentation.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.
Étape 44 — Démarrer le premier container du projet
Section intitulée « Étape 44 — Démarrer le premier container du projet »Objectif. MariaDB tournera réellement sous le contrôle de Compose.
État du projet avant cette étape. Compose sait construire et configurer MariaDB. Le service n’a toujours pas de volume : c’est volontaire.
Comprendre le changement
Section intitulée « Comprendre le changement »up -d crée puis démarre le container. ps montre son état. logs montre ce que le processus écrit. On ne continue que si l’état reste Up.
Faire une seule chose
Section intitulée « Faire une seule chose »Lance MariaDB, attends quelques secondes, puis regarde ps et les logs. À ce stade, seul MariaDB doit exister.
docker compose --env-file srcs/.env -f srcs/docker-compose.yml up -d --build mariadb
docker compose -f srcs/docker-compose.yml ps
docker compose -f srcs/docker-compose.yml logs --tail=60 mariadbCe que fait chaque partie
- up crée et démarre le service.
- -d rend le terminal.
- --build garde l’image à jour.
- ps affiche l’état.
- logs montre le démarrage.
mariadb reste Up et les logs indiquent que le serveur accepte les connexions.
Si cela échoue
Si le service redémarre, lis la première erreur : secret absent, permission ou syntaxe.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi l’initialisation doit-elle être idempotente ?
Elle ne doit pas recréer ni écraser la base lorsque des données existent déjà.