# --- Stage 1: Build PHP & Symfony --- FROM php:8.3-fpm AS php_builder # Set working directory WORKDIR /var/www RUN apt-get update && apt-get install -y \ bash \ unzip \ git \ curl \ libicu-dev \ libpq-dev \ libonig-dev \ libzip-dev \ npm \ && docker-php-ext-install intl pdo pdo_pgsql zip # Make Composer available. COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Copy source. COPY . . RUN printf "APP_ENV=prod\nAPP_DEBUG=0\nDATABASE_URL=\"mysql://user:password@url:3306?serverVersion=1\"\n" > .env.local # Install app dependencies. RUN composer install --no-dev --no-scripts --no-progress --no-interaction --optimize-autoloader # Run Symfony cache warmup. RUN php bin/console cache:warmup # --- Stage 2: Build Frontend --- FROM node:18 AS frontend_builder WORKDIR /app # Copy source again, for front-end assets. COPY . . RUN npm install && npm run build # --- Stage 3: Production Runtime --- FROM php:8.3-fpm # Set working directory WORKDIR /var/www # Install required PHP extensions (must be in runtime) RUN apt-get update && apt-get install -y \ libicu-dev \ libpq-dev \ libonig-dev \ libzip-dev \ && docker-php-ext-install intl pdo pdo_pgsql zip # Copy built app from PHP build stage COPY --from=php_builder /var/www ./ # Copy only built frontend assets COPY --from=frontend_builder /app/public/build ./public/build # Clean up RUN rm -rf .DS_Store .idea .env.local /var/www/html /var/www/var/cache/dev Dockerfile* compose.yaml .git LICENSE README.md node_modules .woodpecker.yml # Copy settings for PHP-FPM COPY --link ./.docker/conf.d/05-app.ini $PHP_INI_DIR/conf.d/ COPY --link ./.docker/conf.d/50-opcache_prod.ini $PHP_INI_DIR/conf.d/ # Set entrypoints + terminal RUN echo "export PS1='\h:\w\$ '" >> /root/.bashrc COPY --chmod=744 --link .docker/docker-entrypoint.d /docker-entrypoint.d COPY --link ./.docker/docker-healthcheck.sh /usr/local/bin/docker-healthcheck COPY --link ./.docker/docker-entrypoint.sh /usr/local/bin/docker-entrypoint HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD ["/usr/local/bin/docker-healthcheck"] ENTRYPOINT ["/usr/local/bin/docker-entrypoint"] # Expose PHP-FPM port EXPOSE 9000 # Start PHP-FPM CMD ["php-fpm"]