« 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 &gt; 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 &gt; PHP &gt; 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 &quot;$@&quot;</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>&quot;$@&quot;</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>&quot;$@&quot;</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]]