# syntax=docker/dockerfile:1.6 ARG PHP_VERSION=8.3 ARG NODE_VERSION=20 ################################################################################ # Node build stage - compile front-end assets ################################################################################ FROM node:${NODE_VERSION}-bookworm AS node_builder WORKDIR /var/www/html COPY package.json package-lock.json ./ RUN npm ci --no-audit --prefer-offline COPY . . RUN npm run build ################################################################################ # Composer dependencies ################################################################################ FROM composer:2 AS vendor WORKDIR /var/www/html COPY composer.json composer.lock ./ # Enable required PHP extensions for Composer (intl, pcntl, gd) RUN apt-get update \ && apt-get install -y --no-install-recommends \ libicu-dev \ libjpeg62-turbo-dev \ libpng-dev \ libfreetype6-dev \ libimagickwand-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ intl \ pcntl \ gd \ && pecl install imagick \ && docker-php-ext-enable imagick \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Install production dependencies only, skip scripts (they run at runtime) RUN composer install \ --no-dev \ --no-scripts \ --no-interaction \ --prefer-dist \ --optimize-autoloader ################################################################################ # PHP-FPM runtime image ################################################################################ FROM php:${PHP_VERSION}-fpm-bullseye AS app ARG UID=1000 ARG GID=1000 ENV APP_ENV=production \ APP_DEBUG=false \ PHP_OPCACHE_VALIDATE_TIMESTAMPS=0 WORKDIR /opt/app # Install system dependencies & PHP extensions RUN apt-get update \ && apt-get install -y --no-install-recommends \ git \ curl \ libjpeg62-turbo-dev \ libpng-dev \ libfreetype6-dev \ libzip-dev \ libonig-dev \ libicu-dev \ libxml2-dev \ libimagickwand \ unzip \ nano \ rsync \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ bcmath \ exif \ gd \ intl \ opcache \ pcntl \ pdo_mysql \ zip \ && pecl install redis \ && pecl install imagemagick \ && docker-php-ext-enable redis imagemagick \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Copy application source COPY . . # Copy vendor dependencies and build artifacts COPY --from=vendor /var/www/html/vendor ./vendor COPY --from=node_builder /var/www/html/public/build ./public/build # Copy production php.ini overrides if present COPY docker/php/php.ini /usr/local/etc/php/conf.d/app.ini COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini # Entrypoint prepares deployment directory on persistent volume COPY docker/app/entrypoint.sh /usr/local/bin/app-entrypoint RUN chmod +x /usr/local/bin/app-entrypoint EXPOSE 9000 ENTRYPOINT ["app-entrypoint"] CMD ["php-fpm"]