Docker image PHP 8.4 : comment je prépare une base propre avec Composer, Node 24 et un utilisateur non-root

Docker image PHP 8.4 avec Composer, Node 24 et déploiement Linux
Base Docker PHP 8.4 avec Composer, Node 24 et exécution Linux non-root pour des déploiements plus propres.

Docker · PHP 8.4 · DevOps

Dans cet article, je te montre comment je structure une docker image php 8.4 avec Composer, Node.js 24 et un utilisateur non-root. L’objectif n’est pas d’empiler des outils “par principe”, mais de produire une base exploitable pour des projets PHP modernes qui compilent des assets, installent des dĂ©pendances proprement et restent lisibles pour l’équipe.

Pourquoi partir d’une image PHP 8.4 dĂ©diĂ©e ?

Sur un projet rĂ©el, le problĂšme n’est pas seulement d’avoir php -v qui rĂ©pond. Il faut aussi :

J’ai conçu ce repo pour rĂ©pondre Ă  ce besoin avec une approche volontairement sobre : partir de php:8.4-cli-bookworm, installer uniquement le nĂ©cessaire, puis valider la toolchain pendant le build.

💡

Pourquoi PHP 8.4 ?

PHP 8.4 apporte des property hooks et de meilleures performances. Migrer maintenant c’est garantir la compatibilitĂ© avec Laravel, Symfony et WordPress.

💡

Pourquoi PHP 8.4 ?

PHP 8.4 apporte des property hooks et de meilleures performances. Migrer maintenant garantit la compatibilité avec Laravel, Symfony et WordPress.

Ce que contient mon image Docker PHP 8.4

Le repo babidi34/secure-php84-node24-image embarque quatre briques utiles au quotidien :

ConcrĂštement, ça donne un socle pratique pour des projets Symfony, Laravel ou des outils internes qui ont besoin de PHP + build frontend dans le mĂȘme environnement de travail.

Base et variables de build

FROM php:8.4-cli-bookworm

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

ARG NVM_VERSION=v0.40.3
ARG NODE_VERSION=24
ARG APP_UID=10001
ARG APP_GID=10001

J’aime bien exposer les versions et UID/GID en arguments de build. C’est plus simple pour faire Ă©voluer l’image sans réécrire toute la logique.

Dépendances minimales et utilisateur non-root

RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
      ca-certificates \
      curl \
      git \
      xz-utils; \
    rm -rf /var/lib/apt/lists/*; \
    groupadd --gid "${APP_GID}" app; \
    useradd --uid "${APP_UID}" --gid app --create-home --shell /bin/bash app; \
    mkdir -p "${NVM_DIR}"; \
    chown -R app:app "${NVM_DIR}"

Le gain est double : l’image reste lisible et tu Ă©vites de faire tourner ton application en root par dĂ©faut. Ce n’est pas une garantie magique, mais c’est une bonne base d’hygiĂšne.

Composer depuis l’image officielle

COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer

Je prĂ©fĂšre cette approche Ă  un installeur tĂ©lĂ©chargĂ© Ă  la volĂ©e. C’est plus direct, plus reproductible et plus simple Ă  relire quand tu reprends l’image plusieurs mois aprĂšs.

Installation de Node.js 24 via nvm

RUN set -eux; \
    curl -fsSL "https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh" -o /tmp/install_nvm.sh; \
    bash /tmp/install_nvm.sh; \
    rm -f /tmp/install_nvm.sh; \
    source "${NVM_DIR}/nvm.sh"; \
    nvm install "${NODE_VERSION}"; \
    nvm alias default "${NODE_VERSION}"; \
    nvm use default; \
    node --version; \
    npm --version; \
    chmod -R a+rX "${NVM_DIR}"

Le point important ici, ce n’est pas seulement Node.js 24. C’est le fait de valider immĂ©diatement la version installĂ©e pendant le build. Tu sais vite si ton image sort dans un Ă©tat exploitable.

💡 Info

Utiliser des images officielles PHP comme base garantit la compatibilité et les mises à jour de sécurité réguliÚres.

⚠

Image de base : fixe la version

Évite les images :latest en production. Fixe une version exacte (php:8.4-fpm-alpine) pour garantir la reproductibilitĂ© de tes builds.

⚠

Fixe la version de l’image

Évite :latest en production. Fixe une version exacte (php:8.4-fpm-alpine) pour garantir la reproductibilitĂ© des builds.

Comment je vĂ©rifie l’image avant de l’utiliser

Le repo documente aussi une sĂ©rie de tests simples. Je te conseille de garder ce genre de vĂ©rification de base avant d’intĂ©grer l’image dans une CI ou dans une chaĂźne de build applicatif :

docker build -t secure-php84-node24-image:local .

docker run --rm secure-php84-node24-image:local php -v
docker run --rm secure-php84-node24-image:local composer --version
docker run --rm secure-php84-node24-image:local bash -lc 'source /usr/local/nvm/nvm.sh && nvm --version && node -v && npm -v'

Avec ça, tu confirmes rapidement que PHP, Composer, nvm, Node et npm sont bien prĂ©sents. C’est basique, mais c’est typiquement le garde-fou qui Ă©vite de dĂ©couvrir un problĂšme au milieu d’une chaĂźne CI/CD.

✅

Bonne pratique multi-stage

Utilise un build multi-stage pour séparer les dépendances de dev des artefacts de production. Résultat : une image finale 2-3x plus légÚre.

✅

Build multi-stage

Sépare les dépendances de dev des artefacts de production. Résultat : une image finale 2-3x plus légÚre.

✅

Build multi-stage

Sépare les dépendances de dev des artefacts de prod. Résultat : une image finale 2-3x plus légÚre.

Dans quels cas cette image est utile

En revanche, si ton besoin impose des extensions PHP spĂ©cifiques, un serveur web embarquĂ© ou une sĂ©paration stricte build/runtime, il faudra dĂ©cliner ce socle plutĂŽt que l’utiliser tel quel. C’est normal : une bonne image de base doit rester simple et assumĂ©e.

⚠ Attention

Attention à bien fixer la version de PHP dans votre FROM pour éviter les surprises lors des rebuilds.

Les erreurs que je vois le plus souvent

Ma checklist pour une image PHP 8.4 exploitable en entreprise

Si tu veux industrialiser ce type de base Docker, l’enjeu n’est pas juste de “faire marcher un build”. Il faut surtout rendre le socle comprĂ©hensible, maintenable et rĂ©pĂ©table. C’est exactement le genre de chantier sur lequel je peux t’aider Ă  cadrer l’exploitation, la maintenance et les mises Ă  jour. Le plus simple est de me contacter ici.

✅ Astuce

Pensez à utiliser les builds multi-stage pour réduire la taille finale de votre image Docker.

FAQ

▶ Pourquoi mettre PHP et Node.js dans la mĂȘme image ?

Parce que certains projets ont besoin des deux au mĂȘme moment, surtout pendant le build : Composer pour les dĂ©pendances PHP, puis Node.js pour les assets. Pour une image de travail ou de CI, c’est souvent plus simple Ă  maintenir.

▶ Est-ce qu’un utilisateur non-root suffit pour sĂ©curiser le conteneur ?

Non. C’est une bonne pratique importante, mais il faut aussi surveiller les dĂ©pendances, limiter les privilĂšges, contrĂŽler les images de base et garder une politique de mise Ă  jour propre.

▶ Pourquoi copier Composer depuis l’image officielle ?

Ça rĂ©duit la complexitĂ© du build et Ă©vite d’ajouter une logique de tĂ©lĂ©chargement/validation de plus. Pour une image simple, c’est une solution propre et lisible.

▶ Faut-il sĂ©parer image de build et image de production ?

Dans beaucoup de cas, oui. Une image de build peut contenir plus d’outils. Une image de production doit rester plus minimale. Le bon choix dĂ©pend de ton application, de ta CI et de tes contraintes d’exploitation.

Ce qu’il faut retenir

Une docker image php 8.4 utile n’a pas besoin d’ĂȘtre compliquĂ©e. Elle doit surtout ĂȘtre cohĂ©rente, testĂ©e et assez propre pour ĂȘtre reprise sans douleur par l’équipe. C’est l’approche que j’applique ici : base officielle, dĂ©pendances limitĂ©es, Composer rĂ©cupĂ©rĂ© proprement, Node.js 24 validĂ© au build et exĂ©cution en utilisateur non-root.

Si tu veux mettre ce genre de socle en place sur tes projets PHP, industrialiser tes images Docker ou fiabiliser tes builds Linux, je peux t’aider Ă  cadrer ça cĂŽtĂ© exploitation et outillage. Tu peux me contacter ici.

Tu veux aller plus loin ?

Je peux t’accompagner sur la containerisation PHP — de l’image de base au dĂ©ploiement Docker Compose en production.

Contacte-moi →