Aller au contenu

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.

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.

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.

Preuves de validation 0 / 3

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

www.conf configurera PHP-FPM. entrypoint.sh attendra MariaDB, installera WordPress si nécessaire, puis lancera PHP-FPM.

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.conf
  • srcs/requirements/wordpress/tools/entrypoint.sh
À EXÉCUTER DANS🖥️ Dans la VM · 📁 racine du repository
touch srcs/requirements/wordpress/conf/www.conf srcs/requirements/wordpress/tools/entrypoint.sh
chmod +x srcs/requirements/wordpress/tools/entrypoint.sh
Ce que fait chaque partie
  1. touch : crée la configuration et le script.
  2. chmod +x : permet à Docker de lancer l’entrypoint.
Résultat attendu

Les deux fichiers existent et le script est exécutable.

Si cela échoue

Vérifiez le chemin requirements/wordpress, pas requirements/nginx.

Preuves de validation 0 / 4

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

Écris uniquement FROM avec le même tag explicite et vérifié que pour MariaDB.

Fichiers ou emplacements concernés

  • srcs/requirements/wordpress/Dockerfile
À ÉCRIRE DANSFichier srcs/requirements/wordpress/Dockerfile

Avant de copier : remplacez <avant-derniere-stable> par vos valeurs.

FROM debian:<avant-derniere-stable>
Ce que fait chaque partie
  1. FROM crée le point de départ de cette deuxième image.
  2. La base est autorisée ; une image wordpress prête ne le serait pas.
Résultat attendu

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.

Preuves de validation 0 / 3

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

PHP-FPM exécute PHP comme un service FastCGI. php-mysql permet à WordPress de parler à MariaDB ; mariadb-client servira aux tests de disponibilité.

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
À ÉCRIRE DANSFichier srcs/requirements/wordpress/Dockerfile · sous FROM
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
  1. php-fpm fournit le processus principal futur.
  2. php-mysql fournit le pilote de base de données.
  3. Les autres extensions couvrent les besoins courants de WordPress.
  4. mariadb-client permet le contrôle réseau vers la base.
  5. Aucun serveur web n’est installé.
Résultat attendu

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.

Preuves de validation 0 / 3

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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é.

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.

Construis une image intermédiaire, affiche la version PHP puis liste les binaires FPM disponibles. Note le nom exact.

À EXÉCUTER DANSDans la VM · racine du repository
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
  1. build exécute FROM et RUN seulement.
  2. php -v prouve que PHP fonctionne.
  3. find découvre le nom réel du binaire PHP-FPM.
Résultat attendu

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.

Preuves de validation 0 / 3

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

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.

Ajoute le second bloc RUN puis reconstruis l’étape pour vérifier wp –info.

Fichiers ou emplacements concernés

  • srcs/requirements/wordpress/Dockerfile
À ÉCRIRE DANSFichier srcs/requirements/wordpress/Dockerfile · sous l’installation PHP
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/wp
Ce que fait chaque partie
  1. curl télécharge le fichier exécutable officiel WP-CLI.
  2. -o choisit son emplacement dans PATH.
  3. chmod +x le rend exécutable.
Résultat attendu

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.

À EXÉCUTER DANSDans la VM · racine du repository
docker build -t wordpress:stage-wpcli srcs/requirements/wordpress
docker run --rm wordpress:stage-wpcli wp --info --allow-root
Ce que fait chaque partie
  1. Le build ajoute WP-CLI à l’image intermédiaire.
  2. wp --info vérifie l’exécutable sans installer de site.
  3. --allow-root est nécessaire dans ce container de test.
Résultat attendu

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é.

Preuves de validation 0 / 3

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

Ajoute les lignes finales au Dockerfile et vérifie les chemins.

Fichiers ou emplacements concernés

  • srcs/requirements/wordpress/Dockerfile
À ÉCRIRE DANSFichier srcs/requirements/wordpress/Dockerfile · remplace <version>

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
  1. WORKDIR fixe le dossier courant du runtime.
  2. Le premier COPY utilise la version PHP découverte.
  3. Le second COPY installe le script.
  4. EXPOSE ne publie pas 9000.
  5. ENTRYPOINT désigne le futur PID initial.
Résultat attendu

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.

Preuves de validation 0 / 4

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

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.

É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
À ÉCRIRE DANS📄 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 = yes
Ce que fait chaque partie
  1. listen 0.0.0.0:9000 : rend FastCGI accessible sur le réseau Docker.
  2. pm : gère un petit pool de workers PHP.
  3. clear_env = no : permet aux workers de recevoir l’environnement requis.
  4. catch_workers_output : dirige les erreurs vers les logs du container.
Résultat attendu

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.

Preuves de validation 0 / 4

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

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.

É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
À ÉCRIRE DANS📄 srcs/requirements/wordpress/tools/entrypoint.sh · première partie
#!/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
  1. mariadb : nom DNS du service Compose, pas une IP.
  2. for 1..30 : maximum 60 secondes d’attente.
  3. exit 1 : signale honnêtement l’échec à Docker.
Résultat attendu

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.

Preuves de validation 0 / 4

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

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
À ÉCRIRE DANS📄 srcs/requirements/wordpress/tools/entrypoint.sh · après l’attente DB
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/html
Ce que fait chaque partie
  1. test -f : protège une installation persistante.
  2. wp core download : télécharge le cœur dans le volume.
  3. wp config create : écrit la connexion à mariadb:3306.
  4. chown : donne les fichiers au processus web.
Résultat attendu

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.

Preuves de validation 0 / 4

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.

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.

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
À ÉCRIRE DANS📄 srcs/requirements/wordpress/tools/entrypoint.sh · installation du site
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
fi
Ce que fait chaque partie
  1. wp core is-installed : rend l’installation idempotente.
  2. WP_ADMIN_USER : doit respecter l’interdiction de nom.
  3. wp user get/create : garantit le second utilisateur sans doublon.
  4. --role=author : exemple de rôle non-administrateur.
Résultat attendu

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.

À ÉCRIRE DANS📄 Dernière ligne de srcs/requirements/wordpress/tools/entrypoint.sh

Avant de copier : remplacez <version> par vos valeurs.

exec php-fpm<version> -F
Ce que fait chaque partie
  1. exec : fait de PHP-FPM le PID 1.
  2. -F : empêche le daemon de se détacher.
Résultat attendu

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.

Preuves de validation 0 / 5

Une case correspond à une preuve observée ou expliquée, pas simplement à une commande copiée.

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.