Construire l’image WordPress
Installer PHP-FPM puis préparer WordPress sans NGINX.
Dans ce chapitre : 11 étapes et 40 preuves de validation.
Étape 55 — Comprendre le rôle du container WordPress
Section intitulée « Étape 55 — Comprendre le rôle du container WordPress »Objectif. Tu sauras exactement ce que le deuxième container doit contenir.
État du projet avant cette étape. MariaDB fonctionne seule sur le réseau.
Comprendre le changement
Section intitulée « Comprendre le changement »Le deuxième container contiendra les fichiers WordPress et PHP-FPM. PHP-FPM exécute les fichiers PHP pour NGINX et écoutera sur le port interne 9000. Il ne contiendra pas NGINX.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute mentalement WordPress au schéma : il rejoint inception, contacte mariadb:3306 et attend plus tard NGINX sur 9000. Aucune commande n’est nécessaire ici.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 56 — Créer les fichiers WordPress
Section intitulée « Étape 56 — Créer les fichiers WordPress »Objectif. Le dossier du deuxième service sera prêt à recevoir sa recette et sa configuration.
État du projet avant cette étape. Le dossier wordpress existe mais ses fichiers sont vides.
Comprendre le changement
Section intitulée « Comprendre le changement »www.conf configurera PHP-FPM. entrypoint.sh attendra MariaDB, installera WordPress si nécessaire, puis lancera PHP-FPM.
Faire une seule chose
Section intitulée « Faire une seule chose »Crée ou vérifie les deux fichiers et rends l’entrypoint exécutable. Ne modifie pas encore Compose : l’image doit d’abord pouvoir se construire.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/conf/www.confsrcs/requirements/wordpress/tools/entrypoint.sh
touch srcs/requirements/wordpress/conf/www.conf srcs/requirements/wordpress/tools/entrypoint.sh
chmod +x srcs/requirements/wordpress/tools/entrypoint.shCe que fait chaque partie
- touch : crée la configuration et le script.
- chmod +x : permet à Docker de lancer l’entrypoint.
Les deux fichiers existent et le script est exécutable.
Si cela échoue
Vérifiez le chemin requirements/wordpress, pas requirements/nginx.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 57 — Écrire seulement FROM pour WordPress
Section intitulée « Étape 57 — Écrire seulement FROM pour WordPress »Objectif. Tu repartiras volontairement de la même base autorisée.
État du projet avant cette étape. MariaDB tourne sur le réseau. Les fichiers WordPress sont vides et son Dockerfile n’a aucune instruction.
Comprendre le changement
Section intitulée « Comprendre le changement »Chaque service possède sa propre image. Utiliser la même base Debian ne fusionne pas les services : leurs paquets, fichiers et processus resteront différents.
Faire une seule chose
Section intitulée « Faire une seule chose »Écris uniquement FROM avec le même tag explicite et vérifié que pour MariaDB.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/Dockerfile
Avant de copier : remplacez <avant-derniere-stable> par vos valeurs.
FROM debian:<avant-derniere-stable>Ce que fait chaque partie
- FROM crée le point de départ de cette deuxième image.
- La base est autorisée ; une image wordpress prête ne le serait pas.
Le Dockerfile WordPress contient seulement FROM avec le tag vérifié.
Si cela échoue
Réutilise exactement la version de base justifiée précédemment, pas latest.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 58 — Installer PHP-FPM et ses dépendances
Section intitulée « Étape 58 — Installer PHP-FPM et ses dépendances »Objectif. Tu ajouteras le moteur PHP sans installer NGINX.
État du projet avant cette étape. L’image WordPress ne contient encore que Debian.
Comprendre le changement
Section intitulée « Comprendre le changement »PHP-FPM exécute PHP comme un service FastCGI. php-mysql permet à WordPress de parler à MariaDB ; mariadb-client servira aux tests de disponibilité.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute le bloc RUN d’installation. Lis la liste et vérifie volontairement que nginx n’y figure pas.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/Dockerfile
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip \
mariadb-client curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*Ce que fait chaque partie
- php-fpm fournit le processus principal futur.
- php-mysql fournit le pilote de base de données.
- Les autres extensions couvrent les besoins courants de WordPress.
- mariadb-client permet le contrôle réseau vers la base.
- Aucun serveur web n’est installé.
Le bloc RUN installe PHP-FPM et ses extensions, sans NGINX.
Si cela échoue
Si un nom de paquet diffère sur ta base, recherche son nom dans apt-cache search et documente l’adaptation.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 59 — Construire et découvrir la version PHP-FPM
Section intitulée « Étape 59 — Construire et découvrir la version PHP-FPM »Objectif. Tu vérifieras les paquets avant d’ajouter WP-CLI ou un script.
État du projet avant cette étape. FROM et RUN sont écrits ; aucun fichier personnel n’est encore copié.
Comprendre le changement
Section intitulée « Comprendre le changement »Debian peut nommer le binaire php-fpm avec sa version, par exemple php-fpm8.x. Le découvrir dans l’image évite de deviner la future commande finale.
Faire une seule chose
Section intitulée « Faire une seule chose »Construis une image intermédiaire, affiche la version PHP puis liste les binaires FPM disponibles. Note le nom exact.
docker build -t wordpress:stage-php srcs/requirements/wordpress
docker run --rm wordpress:stage-php php -v
docker run --rm wordpress:stage-php sh -c "find /usr/sbin -maxdepth 1 -name 'php-fpm*' -type f"Ce que fait chaque partie
- build exécute FROM et RUN seulement.
- php -v prouve que PHP fonctionne.
- find découvre le nom réel du binaire PHP-FPM.
PHP affiche sa version et find retourne un chemin php-fpm<version>.
Si cela échoue
Une liste vide signifie que le paquet php-fpm n’a pas été installé correctement.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 60 — Installer WP-CLI dans l’image
Section intitulée « Étape 60 — Installer WP-CLI dans l’image »Objectif. Tu ajouteras l’outil qui installera WordPress sans navigateur.
État du projet avant cette étape. PHP-FPM fonctionne, mais aucun fichier WordPress n’est encore présent.
Comprendre le changement
Section intitulée « Comprendre le changement »WP-CLI est une commande d’administration WordPress. Elle permettra de télécharger le cœur, créer wp-config.php, installer le site et créer les deux utilisateurs dans l’entrypoint.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute le second bloc RUN puis reconstruis l’étape pour vérifier wp –info.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/Dockerfile
RUN curl -fsSL https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
-o /usr/local/bin/wp \
&& chmod +x /usr/local/bin/wpCe que fait chaque partie
- curl télécharge le fichier exécutable officiel WP-CLI.
- -o choisit son emplacement dans PATH.
- chmod +x le rend exécutable.
Le Dockerfile contient un bloc séparé pour WP-CLI.
Si cela échoue
Une erreur TLS pendant le build nécessite ca-certificates et un réseau fonctionnel dans la VM.
docker build -t wordpress:stage-wpcli srcs/requirements/wordpress
docker run --rm wordpress:stage-wpcli wp --info --allow-rootCe que fait chaque partie
- Le build ajoute WP-CLI à l’image intermédiaire.
- wp --info vérifie l’exécutable sans installer de site.
- --allow-root est nécessaire dans ce container de test.
WP-CLI affiche sa version et le chemin de PHP.
Si cela échoue
Permission denied indique que chmod +x manque ou que le fichier n’a pas été téléchargé.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 61 — Relier la configuration et l’entrypoint
Section intitulée « Étape 61 — Relier la configuration et l’entrypoint »Objectif. Tu termineras la recette sans encore démarrer WordPress.
État du projet avant cette étape. PHP-FPM et WP-CLI sont présents ; www.conf et entrypoint.sh existent.
Comprendre le changement
Section intitulée « Comprendre le changement »WORKDIR fixe /var/www/html. COPY ajoute la configuration et le script. EXPOSE documente 9000 sans le publier. ENTRYPOINT enregistre le script de démarrage.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute les lignes finales au Dockerfile et vérifie les chemins.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/Dockerfile
Avant de copier : remplacez <version> par vos valeurs.
WORKDIR /var/www/html
COPY conf/www.conf /etc/php/<version>/fpm/pool.d/www.conf
COPY tools/entrypoint.sh /usr/local/bin/wordpress-entrypoint
RUN chmod +x /usr/local/bin/wordpress-entrypoint
EXPOSE 9000
ENTRYPOINT ["/usr/local/bin/wordpress-entrypoint"]Ce que fait chaque partie
- WORKDIR fixe le dossier courant du runtime.
- Le premier COPY utilise la version PHP découverte.
- Le second COPY installe le script.
- EXPOSE ne publie pas 9000.
- ENTRYPOINT désigne le futur PID initial.
Le Dockerfile complet possède installation, outils, copies et entrypoint.
Si cela échoue
Le dossier /etc/php/<version> doit correspondre exactement à la version découverte dans l’étape précédente.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 62 — Faire écouter PHP-FPM sur 9000
Section intitulée « Étape 62 — Faire écouter PHP-FPM sur 9000 »Objectif. Le futur NGINX pourra joindre PHP-FPM à travers le réseau.
État du projet avant cette étape. PHP-FPM est installé, mais sa configuration par défaut peut utiliser un socket local invisible depuis un autre container.
Comprendre le changement
Section intitulée « Comprendre le changement »listen = 0.0.0.0:9000 signifie « écouter sur les interfaces du container ». Cela ne publie pas le port sur la VM ; seule une section ports dans Compose le ferait.
Faire une seule chose
Section intitulée « Faire une seule chose »Écris www.conf. Repère la ligne listen et les utilisateurs www-data. Les autres lignes règlent un petit nombre de processus PHP.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/conf/www.conf
[www]
user = www-data
group = www-data
listen = 0.0.0.0:9000
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
clear_env = no
catch_workers_output = yesCe que fait chaque partie
- listen 0.0.0.0:9000 : rend FastCGI accessible sur le réseau Docker.
- pm : gère un petit pool de workers PHP.
- clear_env = no : permet aux workers de recevoir l’environnement requis.
- catch_workers_output : dirige les erreurs vers les logs du container.
NGINX pourra joindre wordpress:9000, mais l’hôte ne verra pas directement ce port.
Si cela échoue
Si NGINX reçoit connection refused, confirmez le chemin du pool et l’absence d’un ancien socket listen.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 63 — Attendre MariaDB avec une limite
Section intitulée « Étape 63 — Attendre MariaDB avec une limite »Objectif. WordPress ne démarrera pas tant que la base n’accepte pas les connexions.
État du projet avant cette étape. Le réseau existe, mais WordPress peut démarrer quelques secondes avant que MariaDB soit prête.
Comprendre le changement
Section intitulée « Comprendre le changement »Le script essaie mariadb:3306 au maximum 30 fois. La boucle est bornée : elle finit par réussir ou par quitter avec une erreur. Ce n’est pas le while true interdit.
Faire une seule chose
Section intitulée « Faire une seule chose »Écris la première partie de l’entrypoint WordPress. Lis mariadb comme un nom DNS fourni par Compose.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/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_PASSWORD="$(cat "$MYSQL_PASSWORD_FILE")"
database_ready=0
for attempt in $(seq 1 30); do
if mariadb-admin ping -h mariadb -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" --silent; then
database_ready=1
break
fi
sleep 2
done
[ "$database_ready" -eq 1 ] || { echo "MariaDB indisponible" >&2; exit 1; }Ce que fait chaque partie
- mariadb : nom DNS du service Compose, pas une IP.
- for 1..30 : maximum 60 secondes d’attente.
- exit 1 : signale honnêtement l’échec à Docker.
WordPress continue dès que MariaDB répond ; sinon il sort après environ 60 secondes.
Si cela échoue
Access denied signale souvent un secret erroné ; unknown host indique réseau ou nom de service ; connection refused indique MariaDB indisponible.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 64 — Installer les fichiers WordPress une seule fois
Section intitulée « Étape 64 — Installer les fichiers WordPress une seule fois »Objectif. Le premier démarrage remplira le futur volume ; les suivants garderont ses fichiers.
État du projet avant cette étape. Le script sait attendre la base mais /var/www/html est encore vide.
Comprendre le changement
Section intitulée « Comprendre le changement »wp core download télécharge WordPress seulement si le marqueur de version est absent. wp config create écrit la connexion à mariadb:3306 seulement si wp-config.php n’existe pas.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute ce bloc après l’attente. Lis les deux if : ils protègent une installation déjà présente.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/tools/entrypoint.sh
if [ ! -f /var/www/html/wp-includes/version.php ]; then
wp core download --allow-root --path=/var/www/html
fi
if [ ! -f /var/www/html/wp-config.php ]; then
wp config create --allow-root --path=/var/www/html \
--dbname="$MYSQL_DATABASE" \
--dbuser="$MYSQL_USER" \
--dbpass="$MYSQL_PASSWORD" \
--dbhost="mariadb:3306" \
--skip-check
fi
chown -R www-data:www-data /var/www/htmlCe que fait chaque partie
- test -f : protège une installation persistante.
- wp core download : télécharge le cœur dans le volume.
- wp config create : écrit la connexion à mariadb:3306.
- chown : donne les fichiers au processus web.
Le premier lancement peuple le volume ; les suivants conservent fichiers et configuration.
Si cela échoue
Si le téléchargement échoue, contrôlez DNS/HTTPS de la VM. Ne recréez pas un volume contenant des données utiles.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.
Étape 65 — Créer deux utilisateurs puis lancer PHP-FPM
Section intitulée « Étape 65 — Créer deux utilisateurs puis lancer PHP-FPM »Objectif. L’image WordPress sera complète et son vrai processus restera au premier plan.
État du projet avant cette étape. Les fichiers peuvent être installés, mais le site n’a pas encore ses comptes et le script n’a pas de commande finale.
Comprendre le changement
Section intitulée « Comprendre le changement »WP-CLI installe le site avec un administrateur puis crée un second utilisateur. Les mots de passe viennent de secrets. Enfin exec php-fpm -F fait de PHP-FPM le processus suivi par Docker.
Faire une seule chose
Section intitulée « Faire une seule chose »Ajoute le bloc utilisateurs, choisis un nom administrateur sans admin ni administrator, puis termine par exec php-fpm<version> -F.
Fichiers ou emplacements concernés
srcs/requirements/wordpress/tools/entrypoint.sh
WP_ADMIN_PASSWORD="$(cat "$WP_ADMIN_PASSWORD_FILE")"
WP_USER_PASSWORD="$(cat "$WP_USER_PASSWORD_FILE")"
if ! wp core is-installed --allow-root --path=/var/www/html; then
wp core install --allow-root --path=/var/www/html \
--url="https://$DOMAIN_NAME" --title="$WP_TITLE" \
--admin_user="$WP_ADMIN_USER" --admin_password="$WP_ADMIN_PASSWORD" \
--admin_email="$WP_ADMIN_EMAIL" --skip-email
fi
if ! wp user get "$WP_USER" --allow-root --path=/var/www/html >/dev/null 2>&1; then
wp user create "$WP_USER" "$WP_USER_EMAIL" \
--role=author --user_pass="$WP_USER_PASSWORD" \
--allow-root --path=/var/www/html
fiCe que fait chaque partie
- wp core is-installed : rend l’installation idempotente.
- WP_ADMIN_USER : doit respecter l’interdiction de nom.
- wp user get/create : garantit le second utilisateur sans doublon.
- --role=author : exemple de rôle non-administrateur.
wp user list affiche au moins deux comptes, dont un administrator au nom conforme.
Si cela échoue
Si l’URL redirige mal, contrôlez DOMAIN_NAME. Si le compte existe, sa création doit être sautée.
Avant de copier : remplacez <version> par vos valeurs.
exec php-fpm<version> -FCe que fait chaque partie
- exec : fait de PHP-FPM le PID 1.
- -F : empêche le daemon de se détacher.
docker top wordpress montre php-fpm au premier plan et ses workers.
Si cela échoue
Si le binaire est introuvable, listez /usr/sbin/php-fpm*. Si le service sort, validez le chemin de www.conf.
Prouver que c’est correct
Section intitulée « Prouver que c’est correct »Question de soutenance — Pourquoi PHP-FPM reste-t-il au premier plan ?
Il est le vrai service du container et doit devenir son processus principal observable.