Files
2026-09-07 20:37:40 +02:00

62 lines
1.9 KiB
Docker

# ---------- Stage 1: build the client (resources/js -> public/build) ----------
FROM node:22-alpine AS client
WORKDIR /build
COPY package.json package-lock.json ./
RUN npm ci --no-audit --no-fund
COPY vite.config.js ./
COPY resources ./resources
RUN npm run build
# ---------- Stage 2: Laravel runtime (php-fpm / reverb / simulate) ----------
FROM php:8.5-fpm-alpine AS app
WORKDIR /var/www/html
RUN apk add --no-cache linux-headers libzip-dev oniguruma-dev sqlite-dev && \
docker-php-ext-install -j"$(nproc)" mbstring sockets pcntl bcmath pdo_sqlite && \
rm -rf /var/cache/apk/*
# opcache defaults for single-container deployments
RUN { \
echo 'opcache.enable=1'; \
echo 'opcache.validate_timestamps=0'; \
echo 'opcache.memory_consumption=64'; \
echo 'opcache.interned_strings_buffer=16'; \
echo 'opcache.max_accelerated_files=10000'; \
} > /usr/local/etc/php/conf.d/zz-opcache.ini
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
COPY composer.json composer.lock ./
RUN composer install \
--no-dev \
--no-interaction \
--prefer-dist \
--no-progress \
--no-scripts \
--no-autoloader
COPY --from=client /build/public/build ./public/build
COPY . .
RUN rm -f bootstrap/cache/services.php bootstrap/cache/packages.php bootstrap/cache/config.php && \
composer dump-autoload --optimize --no-scripts --no-interaction && \
chown -R www-data:www-data storage bootstrap/cache && \
chmod -R ug+rw storage bootstrap/cache
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
STOPSIGNAL SIGTERM
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["php-fpm", "-F"]
# ---------- Stage 3: nginx serving public/ + proxying /app to Reverb ----------
FROM nginx:alpine AS web
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=app /var/www/html/public /var/www/html/public