Dockerfile
Build Stages
Section titled “Build Stages”The Dockerfile uses multi-stage builds to minimize final image size and optimize caching.
Stage 1: Composer Dependencies
Section titled “Stage 1: Composer Dependencies”FROM composer:2 AS composerWORKDIR /appCOPY composer.json composer.lock ./RUN composer install --no-dev --no-scripts --no-autoloader --prefer-distCOPY . .RUN composer dump-autoload --optimizeInstalls PHP dependencies with optimized autoloader.
Stage 2: Node Assets
Section titled “Stage 2: Node Assets”FROM node:20-alpine AS nodeWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run buildBuilds frontend assets. Node is not included in final image.
Stage 3: Base Image
Section titled “Stage 3: Base Image”FROM php:8.3-fpm-alpine AS baseRUN apk add --no-cache \ nginx \ supervisor \ libpq-dev \ libcap \ && docker-php-ext-install pdo_pgsql opcache pcntl \ && pecl install redis && docker-php-ext-enable redisAlpine-based PHP-FPM with required extensions.
Stage 4: Production
Section titled “Stage 4: Production”FROM base AS productionWORKDIR /var/www/html
COPY --from=composer /app/vendor ./vendorCOPY --from=node /app/public/build ./public/buildCOPY . .
COPY docker/nginx.conf /etc/nginx/nginx.confCOPY docker/php.ini /usr/local/etc/php/conf.d/custom.iniCOPY docker/supervisord.conf /etc/supervisord.conf
RUN php artisan config:cache \ && php artisan route:cache \ && php artisan view:cache
EXPOSE 80 8080CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]Final image runs Supervisor which manages all processes.
Image Size
Section titled “Image Size”Typical final image size: 150-200MB
Multi-stage builds exclude:
- Composer binary
- Node.js runtime
- npm packages
- Development dependencies