
đ Au programme
- Pourquoi partir dâune image PHP 8.4 dĂ©diĂ©e ?
- Ce que contient mon image Docker PHP 8.4
- Comment je vĂ©rifie lâimage avant de lâutiliser
- Dans quels cas cette image est utile
- Les erreurs que je vois le plus souvent
- Ma checklist pour une image PHP 8.4 exploitable en entreprise
- FAQ
- Ce quâil faut retenir
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 :
- une version PHP claire et maintenue ;
- Composer disponible sans installation artisanale Ă chaque build ;
- Node.js pour les assets, les tests frontend ou certains outils de build ;
- un utilisateur non-root pour limiter les mauvaises surprises en exécution ;
- une base simple à faire évoluer dans GitLab CI.
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 :
- PHP 8.4 comme base de runtime ;
- Composer 2 rĂ©cupĂ©rĂ© depuis lâimage officielle Composer ;
- Node.js 24 installé via nvm ;
- un utilisateur
appnon-root pour exécuter le conteneur.
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
- tu gÚres plusieurs projets PHP avec des besoins frontend légers ou modérés ;
- tu veux une image de build homogĂšne entre poste local et GitLab CI ;
- tu veux standardiser Composer + Node sans maintenir plusieurs images parallĂšles ;
- tu veux une base plus propre quâun conteneur improvisĂ© rempli Ă la main.
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
- Installer trop dâoutils dâun coup et transformer lâimage en boĂźte Ă tout faire impossible Ă maintenir.
- Oublier lâutilisateur non-root, puis corriger en urgence des problĂšmes de permissions plus tard.
- Ne pas tester les binaires au build et dĂ©couvrir lâerreur seulement dans la CI.
- MĂ©langer runtime et debug dans la mĂȘme image sans discipline.
- Versionner sans stratégie et casser un projet au changement de version Node ou PHP.
Ma checklist pour une image PHP 8.4 exploitable en entreprise
- partir dâune base officielle maintenue ;
- limiter les paquets installés ;
- Ă©viter lâexĂ©cution en root ;
- valider Composer, Node et npm pendant le build ;
- documenter les commandes de vérification ;
- publier lâimage dans un registre maĂźtrisĂ© ;
- garder un historique Git propre pour les montées de version.
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 â