# ----------------------------------------------------------------------------- # Base PHP-FPM with Composer + Symfony-friendly extensions # ----------------------------------------------------------------------------- FROM php:8.2-fpm-alpine AS base WORKDIR /var/www/html # System dependencies RUN apk add --no-cache \ bash git unzip icu-dev libpng-dev libjpeg-turbo-dev libwebp-dev \ libzip-dev oniguruma-dev libxml2-dev postgresql-dev zlib-dev # PHP extensions commonly used by Symfony RUN docker-php-ext-configure gd --with-jpeg --with-webp \ && docker-php-ext-install -j"$(nproc)" \ intl \ gd \ pdo_pgsql \ opcache \ mbstring \ zip \ xml # Composer available in the running container (dev + prod) COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer # Recommended PHP settings (tweak as needed) RUN { \ echo "memory_limit=512M"; \ echo "upload_max_filesize=50M"; \ echo "post_max_size=50M"; \ echo "date.timezone=UTC"; \ } > /usr/local/etc/php/conf.d/php-recommended.ini \ && { \ echo "opcache.enable=1"; \ echo "opcache.enable_cli=1"; \ echo "opcache.memory_consumption=256"; \ echo "opcache.interned_strings_buffer=16"; \ echo "opcache.max_accelerated_files=20000"; \ echo "opcache.validate_timestamps=0"; \ echo "opcache.jit=tracing"; \ echo "opcache.jit_buffer_size=128M"; \ } > /usr/local/etc/php/conf.d/opcache-recommended.ini # Small healthcheck file for Nginx RUN mkdir -p public && printf "OK" > public/healthz # Ensure correct user RUN addgroup -g 1000 app && adduser -D -G app -u 1000 app # php-fpm uses www-data; keep both available RUN chown -R www-data:www-data /var/www # ----------------------------------------------------------------------------- # Development image (mount your code via docker-compose volumes) # ----------------------------------------------------------------------------- FROM base AS dev ENV APP_ENV=dev # Optional: enable Xdebug (uncomment to use) # RUN apk add --no-cache $PHPIZE_DEPS \ # && pecl install xdebug \ # && docker-php-ext-enable xdebug \ # && { \ # echo "xdebug.mode=debug,develop"; \ # echo "xdebug.client_host=host.docker.internal"; \ # } > /usr/local/etc/php/conf.d/xdebug.ini # Composer cache directory (faster installs inside container) ENV COMPOSER_CACHE_DIR=/tmp/composer CMD ["php-fpm"] # ----------------------------------------------------------------------------- # Production image (copies your app + installs deps + warms cache) # ----------------------------------------------------------------------------- FROM base AS prod ENV APP_ENV=prod # Copy only manifests first (better layer caching); ignore if missing COPY composer.json composer.lock* symfony.lock* ./ # Install vendors (no scripts here; run later with console if needed) RUN --mount=type=cache,target=/tmp/composer \ if [ -f composer.json ]; then \ composer install --no-dev --prefer-dist --no-interaction --no-progress --no-scripts; \ fi # Copy the rest of the app COPY . /var/www/html # If Symfony console exists, finalize install & warm cache RUN if [ -f bin/console ]; then \ set -ex; \ composer dump-autoload --no-dev --optimize; \ php bin/console cache:clear --no-warmup; \ php bin/console cache:warmup; \ mkdir -p var && chown -R www-data:www-data var; \ fi USER www-data CMD ["php-fpm"]