# Stage 1: Composer dependencies FROM composer:2 AS vendor WORKDIR /app COPY composer.json composer.lock ./ RUN composer install \ --no-dev \ --no-interaction \ --no-scripts \ --prefer-dist \ --optimize-autoloader \ --ignore-platform-reqs # Stage 2: PHP-FPM production image FROM php:8.4-fpm-alpine # Install system dependencies RUN apk add --no-cache \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ libzip-dev \ libxml2-dev \ curl-dev \ oniguruma-dev \ icu-dev # Install PHP extensions RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install \ pdo_mysql \ bcmath \ mbstring \ gd \ curl \ zip \ xml \ intl \ opcache # Configure OPcache for production RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.interned_strings_buffer=8" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.max_accelerated_files=10000" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.validate_timestamps=0" >> /usr/local/etc/php/conf.d/opcache.ini # PHP production settings RUN echo "upload_max_filesize=20M" >> /usr/local/etc/php/conf.d/uploads.ini \ && echo "post_max_size=25M" >> /usr/local/etc/php/conf.d/uploads.ini \ && echo "memory_limit=128M" >> /usr/local/etc/php/conf.d/uploads.ini \ && echo "max_execution_time=60" >> /usr/local/etc/php/conf.d/uploads.ini # PHP-FPM pool settings para 100 usuarios concurrentes RUN sed -i 's/pm.max_children = 5/pm.max_children = 15/' /usr/local/etc/php-fpm.d/www.conf \ && sed -i 's/pm.start_servers = 2/pm.start_servers = 5/' /usr/local/etc/php-fpm.d/www.conf \ && sed -i 's/pm.min_spare_servers = 1/pm.min_spare_servers = 3/' /usr/local/etc/php-fpm.d/www.conf \ && sed -i 's/pm.max_spare_servers = 3/pm.max_spare_servers = 10/' /usr/local/etc/php-fpm.d/www.conf WORKDIR /var/www/html # Copy application code COPY . . # Copy vendor from composer stage COPY --from=vendor /app/vendor ./vendor # Set permissions RUN chown -R www-data:www-data storage bootstrap/cache \ && chmod -R 775 storage bootstrap/cache # View cache (no depende de .env, se puede hacer en build) RUN php artisan view:cache # Entrypoint: cachear config y rutas con las variables reales de .env.prod RUN printf '#!/bin/sh\nphp artisan config:cache\nphp artisan route:cache\nexec "$@"\n' > /usr/local/bin/entrypoint.sh \ && chmod +x /usr/local/bin/entrypoint.sh EXPOSE 9000 ENTRYPOINT ["entrypoint.sh"] CMD ["php-fpm"]