# syntax=docker/dockerfile:1.7 # ---------- composer deps ---------- FROM composer:2.7 AS composer-deps WORKDIR /build COPY app/composer.json app/composer.lock ./ RUN composer install \ --no-dev --no-scripts --no-autoloader \ --prefer-dist --no-interaction --no-progress # ---------- node / vite build ---------- FROM node:20-alpine AS node-build WORKDIR /build COPY app/package.json app/package-lock.json ./ RUN npm ci --no-audit --no-fund COPY app/ ./ RUN npm run build # ---------- assembled code ---------- FROM alpine:3.20 AS code WORKDIR /var/www/html COPY app/ ./ COPY --from=composer-deps /build/vendor ./vendor COPY --from=node-build /build/public/build ./public/build # ---------- PHP-FPM runtime ---------- FROM php:8.4-fpm-alpine AS php RUN apk add --no-cache \ git curl libpng-dev libzip-dev oniguruma-dev icu-dev \ autoconf g++ make linux-headers $PHPIZE_DEPS \ && docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath gd intl sockets \ && pecl install redis && docker-php-ext-enable redis \ && apk del autoconf g++ make linux-headers $PHPIZE_DEPS \ && rm -rf /tmp/* /var/cache/apk/* COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html COPY --from=code /var/www/html /var/www/html RUN composer dump-autoload --optimize --no-dev --no-interaction \ && mkdir -p storage/framework/cache storage/framework/sessions storage/framework/views \ storage/logs storage/app/public bootstrap/cache \ && chown -R www-data:www-data storage bootstrap/cache \ && chmod -R 775 storage bootstrap/cache COPY docker/php/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["php-fpm"] # ---------- nginx runtime ---------- FROM nginx:1.27-alpine AS nginx COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf COPY --from=code /var/www/html/public /var/www/html/public