« Symfony Docker » : différence entre les versions
Aucun résumé des modifications |
|||
| Ligne 393 : | Ligne 393 : | ||
Cela garantit des performances optimales dans tous les cas ! 🚀 | Cela garantit des performances optimales dans tous les cas ! 🚀 | ||
== Configuration Docker pour un projet Symfony 6 / PHP FPM / avec des bundles locaux == | |||
Voici une méthode complète pour configurer votre environnement Docker avec Symfony 6, PHP 8.2, Apache, PostgreSQL et la gestion des bundles locaux. | |||
=== 1. Structure recommandée === | |||
<pre>~/debian/projet/ | |||
├── app/ # Votre projet Symfony principal | |||
│ ├── src/ | |||
│ ├── vendor/ | |||
│ └── ... | |||
├── Bundles/ # Vos bundles locaux | |||
│ ├── bundlea/ # Bundle A | |||
│ └── bundleb/ # Bundle B | |||
├── docker/ | |||
│ ├── apache/ | |||
│ │ └── vhost.conf # Configuration Apache | |||
│ ├── php/ | |||
│ │ └── php.ini # Configuration PHP | |||
│ └── entrypoint.sh # Script d'initialisation | |||
├── Dockerfile # Fichier de build | |||
└── docker-compose.yml # Configuration des services</pre> | |||
=== 2. Dockerfile === | |||
<syntaxhighlight lang="dockerfile"># Dockerfile | |||
FROM php:8.2-fpm | |||
# Install system dependencies | |||
RUN apt-get update && apt-get install -y \ | |||
git \ | |||
curl \ | |||
libpng-dev \ | |||
libonig-dev \ | |||
libxml2-dev \ | |||
libzip-dev \ | |||
libpq-dev \ | |||
unzip \ | |||
libevent-dev \ | |||
&& rm -rf /var/lib/apt/lists/* | |||
# Install PHP extensions | |||
RUN docker-php-ext-install \ | |||
pdo \ | |||
pdo_pgsql \ | |||
pgsql \ | |||
mbstring \ | |||
exif \ | |||
pcntl \ | |||
bcmath \ | |||
gd \ | |||
zip \ | |||
sockets | |||
# Install event extension | |||
RUN pecl install event && docker-php-ext-enable event | |||
# Install Composer | |||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer | |||
# Set working directory | |||
WORKDIR /var/www | |||
# Copy entrypoint | |||
COPY docker/entrypoint.sh /usr/local/bin/entrypoint | |||
RUN chmod +x /usr/local/bin/entrypoint | |||
ENTRYPOINT ["entrypoint"]</syntaxhighlight> | |||
=== 3. docker-compose.yml === | |||
<syntaxhighlight lang="yaml">version: '3.8' | |||
services: | |||
php: | |||
build: . | |||
volumes: | |||
- ./app:/var/www | |||
- ./Bundles:/var/www/bundles | |||
environment: | |||
- DATABASE_URL=postgresql://symfony:ChangeMe@postgres:5432/app?serverVersion=15&charset=utf8 | |||
depends_on: | |||
- postgres | |||
apache: | |||
image: httpd:2.4 | |||
ports: | |||
- "8080:80" | |||
volumes: | |||
- ./app/public:/var/www/html | |||
- ./docker/apache/vhost.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf | |||
command: ["httpd-foreground"] | |||
depends_on: | |||
- php | |||
postgres: | |||
image: postgres:15 | |||
environment: | |||
POSTGRES_USER: symfony | |||
POSTGRES_PASSWORD: ChangeMe | |||
POSTGRES_DB: app | |||
volumes: | |||
- postgres_data:/var/lib/postgresql/data | |||
# Optionnel: Composer en tant que service | |||
composer: | |||
image: composer:latest | |||
volumes: | |||
- ./app:/var/www | |||
- ./Bundles:/var/www/bundles | |||
working_dir: /var/www | |||
entrypoint: ['composer'] | |||
volumes: | |||
postgres_data:</syntaxhighlight> | |||
=== 4. Configuration Apache (docker/apache/vhost.conf) === | |||
<syntaxhighlight lang="apache"><VirtualHost *:80> | |||
ServerName localhost | |||
DocumentRoot /var/www/html | |||
<Directory /var/www/html> | |||
AllowOverride All | |||
Require all granted | |||
</Directory> | |||
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/public/$1 | |||
</VirtualHost></syntaxhighlight> | |||
=== 5. Script entrypoint.sh === | |||
<syntaxhighlight lang="bash">#!/bin/bash | |||
set -e | |||
# Installer les dépendances si le vendor n'existe pas | |||
if [ ! -d "/var/www/vendor" ]; then | |||
cd /var/www | |||
composer install | |||
fi | |||
# Lancer PHP-FPM | |||
exec docker-php-entrypoint "$@"</syntaxhighlight> | |||
=== 6. Configuration Composer dans votre projet Symfony === | |||
Dans votre <code>app/composer.json</code>, assurez-vous d’avoir: | |||
<syntaxhighlight lang="json">{ | |||
"repositories": [ | |||
{ | |||
"type": "path", | |||
"url": "../Bundles/bundlea", | |||
"options": { | |||
"symlink": true | |||
} | |||
}, | |||
{ | |||
"type": "path", | |||
"url": "../Bundles/bundleb", | |||
"options": { | |||
"symlink": true | |||
} | |||
} | |||
] | |||
}</syntaxhighlight> | |||
=== 7. Workflow recommandé === | |||
<ol style="list-style-type: decimal;"> | |||
<li><p>'''Initialisation''':</p> | |||
<syntaxhighlight lang="bash">docker-compose build | |||
docker-compose up -d</syntaxhighlight></li> | |||
<li><p>'''Pour utiliser Composer''':</p> | |||
<ul> | |||
<li><p>Soit via le service Composer:</p> | |||
<syntaxhighlight lang="bash">docker-compose run --rm composer install | |||
docker-compose run --rm composer update</syntaxhighlight></li> | |||
<li><p>Soit en entrant dans le container PHP:</p> | |||
<syntaxhighlight lang="bash">docker-compose exec php bash | |||
composer install</syntaxhighlight></li></ul> | |||
</li> | |||
<li><p>'''Configuration PHPStorm''':</p> | |||
<ul> | |||
<li>Configurer l’interpréteur PHP dans Settings > PHP</li> | |||
<li>Ajouter les mappings de chemins: | |||
<ul> | |||
<li><code>/var/www</code> → <code>./app</code></li> | |||
<li><code>/var/www/bundles</code> → <code>./Bundles</code></li></ul> | |||
</li> | |||
<li>Configurer le serveur Apache dans Settings > PHP > Servers | |||
<ul> | |||
<li>Nom: Docker Apache</li> | |||
<li>Host: localhost</li> | |||
<li>Port: 8080</li> | |||
<li>Debugger: Xdebug</li> | |||
<li>Path mappings comme ci-dessus</li></ul> | |||
</li></ul> | |||
</li></ol> | |||
=== 8. Avantages de cette configuration === | |||
# '''Développement simultané''': | |||
#* Vos bundles locaux sont accessibles dans le container via <code>/var/www/bundles</code> | |||
#* Les modifications sont immédiatement visibles dans les deux sens | |||
# '''Performance''': | |||
#* Les dépendances sont installées dans le container | |||
#* Les symlinks Composer fonctionnent correctement | |||
# '''Flexibilité''': | |||
#* Vous pouvez utiliser Composer de plusieurs manières | |||
#* Configuration facilement extensible | |||
Cette configuration vous permettra de travailler efficacement avec PHPStorm tout en bénéficiant d’un environnement Docker isolé et reproductible. | |||
Cette ligne est assez importante dans le contexte d’un Dockerfile et d’un script d’entrée (entrypoint). Je vais vous l’expliquer en détail : | |||
=== Explication de <code>exec docker-php-entrypoint "$@"</code> === | |||
# '''<code>exec</code>''' : | |||
#* En shell, la commande <code>exec</code> remplace le processus courant (le script entrypoint.sh) par le nouveau processus spécifié | |||
#* Cela signifie que le processus PID 1 du container devient <code>docker-php-entrypoint</code> au lieu de <code>entrypoint.sh</code> | |||
#* Avantages : | |||
#** Évite d’avoir un processus shell inutile qui reste en vie | |||
#** Permet de recevoir correctement les signaux système (comme SIGTERM) | |||
# '''<code>docker-php-entrypoint</code>''' : | |||
#* C’est le script d’entrée par défaut de l’image officielle PHP | |||
#* Il est fourni par les mainteneurs de l’image Docker PHP | |||
#* Son rôle principal est de : | |||
#** Configurer certaines variables d’environnement | |||
#** Préparer le runtime PHP | |||
#** Finalement lancer PHP-FPM | |||
# '''<code>"$@"</code>''' : | |||
#* C’est une notation spéciale en shell qui signifie “tous les arguments passés au script” | |||
#* Si vous lancez le container avec <code>docker run votre-image php -v</code>, alors <code>"$@"</code> contiendra <code>php -v</code> | |||
#* Cela permet de transmettre tous les arguments au processus suivant | |||
=== Pourquoi c’est important dans votre cas ? === | |||
Dans votre entrypoint.sh, vous faites d’abord : | |||
<syntaxhighlight lang="bash"># Vérifie si vendor existe, sinon installe les dépendances | |||
if [ ! -d "/var/www/vendor" ]; then | |||
cd /var/www | |||
composer install | |||
fi</syntaxhighlight> | |||
Puis vous terminez avec : | |||
<syntaxhighlight lang="bash"># Passe le relais au entrypoint officiel PHP | |||
exec docker-php-entrypoint "$@"</syntaxhighlight> | |||
Cela signifie : 1. Votre script fait d’abord son travail personnalisé (vérifier/vendor et installer les dépendances si besoin) 2. Ensuite, il “passe la main” au processus PHP-FPM officiel, devenant ainsi le processus principal du container | |||
=== Alternative sans <code>exec</code> === | |||
Si vous écriviez simplement : | |||
<syntaxhighlight lang="bash">docker-php-entrypoint "$@"</syntaxhighlight> | |||
Au lieu de : | |||
<syntaxhighlight lang="bash">exec docker-php-entrypoint "$@"</syntaxhighlight> | |||
Alors : - Le shell du script entrypoint.sh resterait en vie inutilement - Les signaux système ne seraient pas correctement transmis à PHP-FPM - Vous auriez un processus superflu dans votre container | |||
=== En résumé === | |||
Cette ligne est une bonne pratique Docker qui permet : 1. D’exécuter votre logique personnalisée avant le démarrage 2. De transférer proprement l’exécution au processus principal 3. De garantir une gestion propre des processus et des signaux | |||
C’est particulièrement important pour des services comme PHP-FPM qui doivent être le processus principal du container pour fonctionner correctement. | |||
[[Catégorie:Symfony]] [[Catégorie:Docker]] | [[Catégorie:Symfony]] [[Catégorie:Docker]] | ||