« Symfony Docker » : différence entre les versions
Aucun résumé des modifications |
|||
| Ligne 1 : | Ligne 1 : | ||
== '''Docker avec les commandes <code>composer</code>, <code>symfony</code> et <code>bin/console</code>''' == | |||
Pour pouvoir exécuter des commandes '''<code>composer</code>''', '''<code>symfony</code>''' et '''<code>bin/console</code>''' depuis votre machine locale tout en les faisant affecter le conteneur Docker, voici une approche optimale basée sur des '''volumes montés''' et des '''alias pratiques'''. | |||
----- | |||
=== '''1. Montage des volumes pour synchroniser les fichiers''' === | |||
L’idée est de '''monter votre code local dans le conteneur''' pour que les modifications soient immédiatement visibles des deux côtés. | |||
==== '''Solution 1 : Utilisation de <code>docker-compose.yml</code> (recommandé)''' ==== | |||
<syntaxhighlight lang="yaml">version: '3.8' | |||
services: | |||
app: | |||
build: . | |||
volumes: | |||
- ./:/var/www/html # Monte le projet Symfony (y compris vendor/) | |||
- ~/.composer:/tmp/composer # Cache Composer (optionnel) | |||
working_dir: /var/www/html | |||
ports: | |||
- "8000:8000" # Symfony CLI ou PHP-FPM | |||
tty: true | |||
stdin_open: true</syntaxhighlight> | |||
==== '''Explications :''' ==== | |||
* <code>./:/var/www/html</code> : Synchronise le code local avec le conteneur (y compris <code>vendor/</code>). | |||
* <code>~/.composer:/tmp/composer</code> : Cache Composer pour éviter de retélécharger les dépendances. | |||
* <code>working_dir</code> : S’assure que les commandes s’exécutent dans <code>/var/www/html</code>. | |||
----- | |||
=== '''2. Exécuter des commandes dans le conteneur depuis l’hôte''' === | |||
==== '''Méthode 1 : <code>docker-compose exec</code> (pour les commandes ponctuelles)''' ==== | |||
<syntaxhighlight lang="bash"># Commande Composer (ex: ajouter un bundle) | |||
docker-compose exec app composer require mon/bundle-local | |||
# Commande Symfony CLI (ex: lancer le serveur) | |||
docker-compose exec app symfony serve -d | |||
# Commande Console (ex: migrer la base) | |||
docker-compose exec app php bin/console make:migration</syntaxhighlight> | |||
==== '''Méthode 2 : Alias shell pour simplifier (dans <code>~/.bashrc</code> ou <code>~/.zshrc</code>)''' ==== | |||
<syntaxhighlight lang="bash"># Alias pour Composer | |||
alias dc-composer="docker-compose exec app composer" | |||
# Alias pour Symfony CLI | |||
alias dc-symfony="docker-compose exec app symfony" | |||
# Alias pour la Console Symfony | |||
alias dc-console="docker-compose exec app php bin/console"</syntaxhighlight> | |||
'''Utilisation :''' | |||
<syntaxhighlight lang="bash">dc-composer require mon/bundle-local | |||
dc-console make:migration | |||
dc-symfony serve -d</syntaxhighlight> | |||
----- | |||
=== '''3. Cas particulier : Développement d’un bundle local''' === | |||
Si vous développez un bundle en local et qu’il est lié via <code>composer.json</code> en <code>"type": "path"</code>, assurez-vous que : 1. '''Le chemin est correct''' dans <code>composer.json</code> : <code>json { "require": { "mon/bundle-local": "*", "symfony/framework-bundle": "^6.0" }, "repositories": [ { "type": "path", "url": "./packages/mon-bundle-local" } ] }</code> 2. '''Le volume est bien monté''' dans <code>docker-compose.yml</code> : <code>yaml volumes: - ./:/var/www/html - ./packages/mon-bundle-local:/var/www/html/packages/mon-bundle-local # Si le bundle est dans un sous-dossier</code> 3. '''Reconstruire l’autoload''' après modification du bundle : <code>bash docker-compose exec app composer dump-autoload</code> | |||
----- | |||
=== '''4. Optimisation pour le dev : Xdebug + volumes''' === | |||
Si vous utilisez '''Xdebug''' ou souhaitez un rechargement automatique : | |||
<syntaxhighlight lang="yaml"># docker-compose.yml (extrait) | |||
services: | |||
app: | |||
environment: | |||
XDEBUG_MODE: "develop,debug" | |||
volumes: | |||
- ./:/var/www/html | |||
- ~/.composer:/tmp/composer</syntaxhighlight> | |||
----- | |||
=== '''Récapitulatif des bonnes pratiques''' === | |||
{| class="wikitable" | |||
|- | |||
! Besoin | |||
! Solution | |||
|- | |||
| '''Exécuter <code>composer</code>''' | |||
| <code>docker-compose exec app composer require mon/bundle</code> | |||
|- | |||
| '''Lancer <code>bin/console</code>''' | |||
| <code>docker-compose exec app php bin/console make:migration</code> | |||
|- | |||
| '''Utiliser Symfony CLI''' | |||
| <code>docker-compose exec app symfony serve -d</code> | |||
|- | |||
| '''Développer un bundle local''' | |||
| Monter le dossier du bundle + <code>composer dump-autoload</code> après modification | |||
|- | |||
| '''Optimiser l’expérience dev''' | |||
| Alias shell + volumes montés + Xdebug | |||
|} | |||
----- | |||
==== '''Conclusion''' ==== | |||
* ✅ '''Pour les commandes <code>composer</code>/<code>symfony</code>/<code>console</code>''' : Utilisez <code>docker-compose exec</code>. | |||
* ✅ '''Pour le dev de bundles locaux''' : Montez le dossier et utilisez <code>composer dump-autoload</code>. | |||
* ✅ '''Pour simplifier les commandes''' : Créez des alias (<code>dc-composer</code>, <code>dc-console</code>). | |||
Cette approche permet un '''développement fluide''' sans avoir à reconstruire l’image à chaque modification. 🚀 | |||
== '''composer dump-autoload''' == | == '''composer dump-autoload''' == | ||
Version du 16 juin 2025 à 22:34
Docker avec les commandes composer, symfony et bin/console
Pour pouvoir exécuter des commandes composer, symfony et bin/console depuis votre machine locale tout en les faisant affecter le conteneur Docker, voici une approche optimale basée sur des volumes montés et des alias pratiques.
1. Montage des volumes pour synchroniser les fichiers
L’idée est de monter votre code local dans le conteneur pour que les modifications soient immédiatement visibles des deux côtés.
Solution 1 : Utilisation de docker-compose.yml (recommandé)
version: '3.8'
services:
app:
build: .
volumes:
- ./:/var/www/html # Monte le projet Symfony (y compris vendor/)
- ~/.composer:/tmp/composer # Cache Composer (optionnel)
working_dir: /var/www/html
ports:
- "8000:8000" # Symfony CLI ou PHP-FPM
tty: true
stdin_open: true
Explications :
./:/var/www/html: Synchronise le code local avec le conteneur (y comprisvendor/).~/.composer:/tmp/composer: Cache Composer pour éviter de retélécharger les dépendances.working_dir: S’assure que les commandes s’exécutent dans/var/www/html.
2. Exécuter des commandes dans le conteneur depuis l’hôte
Méthode 1 : docker-compose exec (pour les commandes ponctuelles)
# Commande Composer (ex: ajouter un bundle)
docker-compose exec app composer require mon/bundle-local
# Commande Symfony CLI (ex: lancer le serveur)
docker-compose exec app symfony serve -d
# Commande Console (ex: migrer la base)
docker-compose exec app php bin/console make:migration
Méthode 2 : Alias shell pour simplifier (dans ~/.bashrc ou ~/.zshrc)
# Alias pour Composer
alias dc-composer="docker-compose exec app composer"
# Alias pour Symfony CLI
alias dc-symfony="docker-compose exec app symfony"
# Alias pour la Console Symfony
alias dc-console="docker-compose exec app php bin/console"
Utilisation :
dc-composer require mon/bundle-local
dc-console make:migration
dc-symfony serve -d
3. Cas particulier : Développement d’un bundle local
Si vous développez un bundle en local et qu’il est lié via composer.json en "type": "path", assurez-vous que : 1. Le chemin est correct dans composer.json : json { "require": { "mon/bundle-local": "*", "symfony/framework-bundle": "^6.0" }, "repositories": [ { "type": "path", "url": "./packages/mon-bundle-local" } ] } 2. Le volume est bien monté dans docker-compose.yml : yaml volumes: - ./:/var/www/html - ./packages/mon-bundle-local:/var/www/html/packages/mon-bundle-local # Si le bundle est dans un sous-dossier 3. Reconstruire l’autoload après modification du bundle : bash docker-compose exec app composer dump-autoload
4. Optimisation pour le dev : Xdebug + volumes
Si vous utilisez Xdebug ou souhaitez un rechargement automatique :
# docker-compose.yml (extrait)
services:
app:
environment:
XDEBUG_MODE: "develop,debug"
volumes:
- ./:/var/www/html
- ~/.composer:/tmp/composer
Récapitulatif des bonnes pratiques
| Besoin | Solution |
|---|---|
Exécuter composer
|
docker-compose exec app composer require mon/bundle
|
Lancer bin/console
|
docker-compose exec app php bin/console make:migration
|
| Utiliser Symfony CLI | docker-compose exec app symfony serve -d
|
| Développer un bundle local | Monter le dossier du bundle + composer dump-autoload après modification
|
| Optimiser l’expérience dev | Alias shell + volumes montés + Xdebug |
Conclusion
- ✅ Pour les commandes
composer/symfony/console: Utilisezdocker-compose exec. - ✅ Pour le dev de bundles locaux : Montez le dossier et utilisez
composer dump-autoload. - ✅ Pour simplifier les commandes : Créez des alias (
dc-composer,dc-console).
Cette approche permet un développement fluide sans avoir à reconstruire l’image à chaque modification. 🚀
composer dump-autoload
La commande composer dump-autoload est une commande essentielle dans l’écosystème PHP/Composer. Elle régénère le fichier d’autoloading (chargement automatique des classes) sans réinstaller les dépendances. Voici ce qu’elle fait en détail :
À quoi sert composer dump-autoload ?
- Reconstruit l’autoloader de Composer
- Met à jour le fichier
vendor/autoload.phpqui gère le chargement automatique des classes PHP. - Utile quand vous ajoutez/modifiez des classes sans passer par
composer install/update.
- Met à jour le fichier
- Optimise les performances (si utilisé avec
-o)Avec l’option
--optimize(-o), Composer génère une version optimisée de l’autoloader (classe map statique), ce qui accélère le chargement des classes en production :composer dump-autoload --optimize
- Prend en compte les classes dans
autoloadouautoload-devSi vous avez des classes définies dans
composer.jsonsous :"autoload": { "psr-4": { "MonApp\\": "src/" } }
La commande les intègre dans l’autoloader.
Quand l’utiliser ?
| Cas d’usage | Commande recommandée |
|---|---|
| Après avoir ajouté une nouvelle classe manuellement (sans Composer). | composer dump-autoload
|
| En production pour optimiser les performances. | composer dump-autoload --optimize
|
Après avoir modifié composer.json (sans vouloir réinstaller les dépendances).
|
composer dump-autoload
|
| Pour vérifier les espaces de noms (PSR-4). | composer dump-autoload
|
Différence avec composer install et composer update
composer install:
Installe les dépendances ET régénère l’autoloader.
composer update:
Met à jour les dépendances ET régénère l’autoloader.
composer dump-autoload:
Ne touche pas aux dépendances – ne fait que mettre à jour l’autoloader.
Exemple concret dans un projet Symfony
- Vous ajoutez une nouvelle entité
src/Entity/Product.php:Symfony utilise l’autoloading PSR-4, donc la classe sera automatiquement détectée.
Si elle n’est pas reconnue, exécutez :
composer dump-autoload
- Vous développez un bundle local (lié via
"type": "path"danscomposer.json) :Après avoir modifié le bundle, pour que Symfony reconnaisse les nouvelles classes :
composer dump-autoload
Bonnes pratiques
En développement :
Utilisezcomposer dump-autoloadaprès avoir ajouté des classes manuellement.
En production :
Utilisezcomposer dump-autoload --optimizepour des performances optimales.
Avec Docker :
Si vous montez un volume (./:/var/www/html), exécutez la commande dans le conteneur :docker-compose exec app composer dump-autoload
Résumé
composer dump-autoload est un outil léger pour rafraîchir l’autoloader sans toucher aux dépendances. Indispensable pour :
- Le développement de bundles locaux.
- L’ajout manuel de classes.
- L’optimisation en production.
Utilisez-la dès que vous rencontrez des erreurs du type :
> “Class ‘MonApp\Entity\Product’ not found”
🚀 Astuce : Combinez-la avec --optimize en prod pour un boost de performances !
Symfony cache et composer cache avec Docker :
1. Rôle du dossier /var/cache dans Symfony
Symfony utilise ce dossier pour : - Le cache applicatif (ex : compilation des templates Twig, cache des routes, annotations) - Le cache système (ex : fichiers de configuration compilés comme srcApp_KernelDevDebugContainer.php)
Problème avec Docker :
Par défaut, ce cache est régénéré à chaque démarrage du conteneur → ralentissements (surtout en dev).
2. Stratégies pour optimiser le cache avec Docker
A. Monter /var/cache en volume (pour le dev)
# docker-compose.yml
services:
php:
volumes:
- ./var/cache:/var/www/html/var/cache # Monte le cache Symfony
Avantages : - Le cache persiste entre les redémarrages du conteneur. - Meilleures performances en développement.
Inconvénients : - Peut causer des problèmes de permissions (solved avec chmod ou entrypoint.sh).
B. Utiliser un volume Docker nommé (prod + dev)
volumes:
symfony_cache: # Volume dédié pour le cache
services:
php:
volumes:
- symfony_cache:/var/www/html/var/cache
Bonus : Ajoutez un entrypoint.sh pour fixer les permissions :
#!/bin/bash
set -e
# Fixe les permissions du cache
chown -R www-data:www-data /var/www/html/var
exec "$@"
C. Cache warming en production
Dans votre Dockerfile :
FROM composer AS builder
WORKDIR /app
COPY . .
RUN composer install --no-dev --optimize-autoloader
FROM php:8.2-fpm
COPY --from=builder /app /var/www/html
RUN php bin/console cache:warmup # ⚡ Pré-chauffe le cache
3. Gestion des environnements
| Environnement | Recommandation |
|---|---|
| Développement | Volume monté (./var/cache:/...) + chmod
|
| Production | Volume nommé + cache warming dans l’image |
| CI/CD | Cache éphémère (pas de montage) |
4. Exemple complet (docker-compose.yml)
version: '3.8'
volumes:
symfony_cache: # Pour le cache
composer_cache: # Pour Composer
services:
app:
build: .
volumes:
- ./:/var/www/html
- symfony_cache:/var/www/html/var/cache
- composer_cache:/tmp/composer
environment:
APP_ENV: dev
COMPOSER_CACHE_DIR: /tmp/composer
5. Bonnes pratiques
En dev : Montez
var/cachepour éviter de tout recompiler.En prod : Utilisez
cache:warmupdans l’image + volume nommé.Permissions : Résolvez-les via
entrypoint.shoudocker-compose:user: "${UID:-1000}:${GID:-1000}"
Différence avec Composer Cache
Composer (~/.composer)
|
Symfony (/var/cache)
| |
|---|---|---|
| Type | Cache de dépendances | Cache applicatif |
| Montage | Toujours utile | Surtout en dev |
| Prod | Volume nommé recommandé | Warming dans l’image + volume |
Résumé
- Oui, on peut appliquer le même principe de volume monté pour
/var/cache.
- Mais : Symfony a besoin d’une gestion plus active (warming, permissions).
- Optimisez :
- Dev → Volume monté + permissions
- Dev → Volume monté + permissions
- Prod → Cache warming + volumes nommés
Cela garantit des performances optimales dans tous les cas ! 🚀