Ajouter le volume MariaDB
Déclarer puis attacher un volume nommé, une ligne à la fois.
Dans ce chapitre : 6 étapes et 20 preuves de validation.
Étape 45 — Observer l’absence de stockage externe
Section intitulée « Étape 45 — Observer l’absence de stockage externe »Objectif. Tu constateras le problème avant d’ajouter sa solution.
État du projet avant cette étape. MariaDB tourne correctement, mais aucun volume n’est déclaré.
Comprendre le changement
Section intitulée « Comprendre le changement »Sans montage sur /var/lib/mysql, les écritures appartiennent au filesystem du container. Supprimer ce container supprimerait ces écritures.
Faire une seule chose
Section intitulée « Faire une seule chose »Inspecte les montages sans arrêter MariaDB. La liste ne doit pas encore contenir /var/lib/mysql avec Type=volume.
docker inspect "$(docker compose -f srcs/docker-compose.yml ps -q mariadb)" --format '{{json .Mounts}}'Ce que fait chaque partie
- compose ps -q récupère l’identifiant du container MariaDB.
- docker inspect lit sa configuration réelle.
- .Mounts limite la sortie aux stockages montés.
Aucun montage Type=volume ne cible /var/lib/mysql.
Si cela échoue
Un identifiant vide signifie que MariaDB n’est pas Up ; corrige le service avant de parler de volume.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Que prouve Type=volume ?
Le service monte un objet volume Docker nommé et non un chemin hôte directement.
Étape 46 — Vérifier le dossier physique demandé
Section intitulée « Étape 46 — Vérifier le dossier physique demandé »Objectif. Tu prépareras la destination hôte avant de configurer Docker.
État du projet avant cette étape. Le volume n’existe pas encore. Le PDF impose cependant son emplacement physique sous /home/<login>/data.
Comprendre le changement
Section intitulée « Comprendre le changement »Le dossier est sur l’hôte Docker, donc dans la VM. Il n’est ni dans le repository ni dans le container.
Faire une seule chose
Section intitulée « Faire une seule chose »Vérifie le dossier MariaDB créé pendant la préparation du repository. Crée-le seulement s’il manque, avec ton vrai login.
Fichiers ou emplacements concernés
/home/<login>/data/mariadb
echo "login=$USER"
sudo mkdir -p "/home/$USER/data/mariadb"
sudo chown "$USER:$USER" "/home/$USER/data/mariadb"
ls -ld "/home/$USER/data/mariadb"Ce que fait chaque partie
- $USER fournit le login de la session.
- mkdir -p garantit que le chemin existe.
- chown donne initialement le dossier à ton utilisateur.
- ls affiche le chemin et son propriétaire.
Le chemin /home/ton_login/data/mariadb existe sur la VM.
Si cela échoue
Si $USER n’est pas ton login 42, utilise explicitement ton vrai login demandé par le sujet.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Que prouve Type=volume ?
Le service monte un objet volume Docker nommé et non un chemin hôte directement.
Étape 47 — Déclarer le volume nommé
Section intitulée « Étape 47 — Déclarer le volume nommé »Objectif. Compose connaîtra le stockage, sans encore le monter dans MariaDB.
État du projet avant cette étape. Le dossier hôte existe. docker-compose.yml ne contient aucune section volumes globale.
Comprendre le changement
Section intitulée « Comprendre le changement »La section globale crée un objet Docker nommé mariadb_data. Les options du pilote local indiquent son emplacement physique. À ce stade, aucun service ne l’utilise encore.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute uniquement la section globale, au même niveau que services. Valide le YAML.
Fichiers ou emplacements concernés
srcs/docker-compose.yml
volumes:
mariadb_data:
name: mariadb_data
driver: local
driver_opts:
type: none
o: bind
device: /home/${LOGIN}/data/mariadbCe que fait chaque partie
- volumes est aligné avec services.
- mariadb_data est le nom logique dans Compose.
- name fixe le nom visible dans Docker.
- driver_opts configure le pilote local.
- device utilise LOGIN chargé depuis .env.
compose config affiche une section volumes mariadb_data.
Si cela échoue
Si LOGIN est vide dans config, relance avec --env-file srcs/.env et vérifie la variable.
docker compose --env-file srcs/.env -f srcs/docker-compose.yml configCe que fait chaque partie
- --env-file fournit LOGIN pour l’interpolation.
- config valide sans créer le volume.
La sortie montre le chemin complet avec ton login, sans placeholder.
Si cela échoue
Une erreur additional property volumes signifie que la section est mal alignée.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Que prouve Type=volume ?
Le service monte un objet volume Docker nommé et non un chemin hôte directement.
Étape 48 — Attacher le volume à MariaDB
Section intitulée « Étape 48 — Attacher le volume à MariaDB »Objectif. Tu relieras l’objet Docker au dossier de données du service.
État du projet avant cette étape. Le volume est déclaré mais le service MariaDB ne l’utilise pas encore.
Comprendre le changement
Section intitulée « Comprendre le changement »La syntaxe nom:destination donne à MariaDB l’objet nommé. Le service ne reçoit jamais directement le chemin /home/… : inspect devra montrer Type=volume.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute les deux lignes sous le service mariadb, au même niveau que environment, secrets et restart.
Fichiers ou emplacements concernés
srcs/docker-compose.yml
volumes:
- mariadb_data:/var/lib/mysqlCe que fait chaque partie
- volumes du service ouvre ses montages.
- mariadb_data référence la déclaration globale.
- /var/lib/mysql est le datadir configuré de MariaDB.
Le service référence le nom mariadb_data, jamais un chemin hôte.
Si cela échoue
N’écris pas /home/...:/var/lib/mysql dans le service : ce serait un bind mount direct.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Que prouve Type=volume ?
Le service monte un objet volume Docker nommé et non un chemin hôte directement.
Étape 49 — Recréer MariaDB avec le volume
Section intitulée « Étape 49 — Recréer MariaDB avec le volume »Objectif. Tu vérifieras le type de montage réellement appliqué.
État du projet avant cette étape. Le fichier déclare et attache le volume, mais le container existant a été créé avant cette modification.
Comprendre le changement
Section intitulée « Comprendre le changement »down supprime l’ancien container. up en crée un nouveau avec le montage. inspect doit ensuite prouver Type=volume et la bonne destination.
Faire une seule chose
Section intitulée « Faire une seule chose »Valide, recrée, puis inspecte. Cette première recréation peut réinitialiser les données de test car elles n’étaient pas encore protégées.
docker compose --env-file srcs/.env -f srcs/docker-compose.yml config
docker compose -f srcs/docker-compose.yml down
docker compose --env-file srcs/.env -f srcs/docker-compose.yml up -d
docker inspect "$(docker compose -f srcs/docker-compose.yml ps -q mariadb)" --format '{{range .Mounts}}{{.Type}} | {{.Name}} | {{.Destination}}{{println}}{{end}}'Ce que fait chaque partie
- config contrôle le plan final de cette étape.
- down retire le container sans volume attaché.
- up crée le volume et un nouveau container.
- inspect affiche type, nom et destination du montage.
La sortie contient volume | mariadb_data | /var/lib/mysql.
Si cela échoue
Si le type vaut bind, le service utilise probablement un chemin hôte direct au lieu du nom du volume.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Que prouve Type=volume ?
Le service monte un objet volume Docker nommé et non un chemin hôte directement.
Étape 50 — Prouver la persistance avec une donnée témoin
Section intitulée « Étape 50 — Prouver la persistance avec une donnée témoin »Objectif. Tu vérifieras une vraie ligne de base après remplacement du container.
État du projet avant cette étape. MariaDB utilise maintenant le volume nommé.
Comprendre le changement
Section intitulée « Comprendre le changement »Une base portant le même nom pourrait être recréée automatiquement. Une ligne témoin permet une preuve plus forte : elle n’existera après down/up que si le volume a conservé les données.
Faire une seule chose
Section intitulée « Faire une seule chose »Crée une table et la valeur 42, remplace le container sans -v, puis lis à nouveau cette valeur.
docker compose -f srcs/docker-compose.yml exec mariadb sh -c 'mariadb -uroot -p"$(cat /run/secrets/db_root_password)" "$MYSQL_DATABASE" -e "CREATE TABLE IF NOT EXISTS persistence_probe (id INT PRIMARY KEY); INSERT IGNORE INTO persistence_probe VALUES (42);"'
docker compose -f srcs/docker-compose.yml down
docker compose --env-file srcs/.env -f srcs/docker-compose.yml up -d
docker compose -f srcs/docker-compose.yml exec mariadb sh -c 'mariadb -uroot -p"$(cat /run/secrets/db_root_password)" "$MYSQL_DATABASE" -e "SELECT id FROM persistence_probe;"'Ce que fait chaque partie
- exec lance le client dans le container.
- Le mot de passe est lu depuis le secret sans être affiché.
- CREATE TABLE et INSERT créent la preuve.
- down remplace le container mais ne supprime pas le volume.
- SELECT lit la donnée après recréation.
Le dernier SELECT affiche la valeur 42.
Si cela échoue
N’utilise pas down -v : cette option supprime précisément le volume que tu cherches à tester.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Que prouve Type=volume ?
Le service monte un objet volume Docker nommé et non un chemin hôte directement.