diff --git a/Dockerfile b/Dockerfile index cb18c78f4..1cfb0e5a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,40 @@ ARG BASE_IMAGE=debian:bookworm-slim ARG PHP_VERSION=8.4 +# --- +# Build assets stage - runs on native platform (not emulated) +# This stage builds the frontend assets (JavaScript, CSS) using Node.js and Yarn +# The --platform=$BUILDPLATFORM ensures this stage runs on the native build platform (amd64) +# and not under emulation for ARM builds +FROM --platform=$BUILDPLATFORM composer:latest AS composer-deps + +WORKDIR /build + +# Copy entire project to install dependencies and generate translations +COPY . . + +# Install composer dependencies (needed for Symfony UX assets and cache warmup) +RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist --ignore-platform-reqs && \ + composer dump-autoload --no-dev --classmap-authoritative && \ + php bin/console cache:clear --no-warmup && \ + php bin/console cache:warmup + +# --- + +FROM --platform=$BUILDPLATFORM node:22-bookworm-slim AS assets + +WORKDIR /build + +# Copy entire project with vendor and generated translations from composer-deps stage +COPY --from=composer-deps /build ./ + +# Install dependencies and build assets +RUN yarn install --network-timeout 600000 && \ + yarn build && \ + yarn cache clean + +# --- + FROM ${BASE_IMAGE} AS base ARG PHP_VERSION @@ -36,6 +70,7 @@ RUN apt-get update && apt-get -y install \ php${PHP_VERSION}-sqlite3 \ php${PHP_VERSION}-mysql \ php${PHP_VERSION}-pgsql \ + git \ gpg \ sudo \ && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/* \ @@ -45,15 +80,6 @@ RUN apt-get update && apt-get -y install \ # delete the "index.html" that installing Apache drops in here && rm -rvf /var/www/html/* -# Install node and yarn -RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ - curl -sL https://deb.nodesource.com/setup_22.x | bash - && \ - apt-get update && apt-get install -y \ - nodejs \ - yarn \ - && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/* - # Install composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer @@ -149,14 +175,13 @@ RUN a2dissite 000-default.conf && \ a2enconf docker-php && \ a2enmod rewrite -# Install composer and yarn dependencies for Part-DB +# Install composer dependencies for Part-DB USER www-data RUN composer install -a --no-dev && \ composer clear-cache -RUN yarn install --network-timeout 600000 && \ - yarn build && \ - yarn cache clean && \ - rm -rf node_modules/ + +# Copy pre-built assets from the assets stage +COPY --from=assets /build/public/build ./public/build # Use docker env to output logs to stdout ENV APP_ENV=docker diff --git a/Dockerfile-frankenphp b/Dockerfile-frankenphp index f381f3306..0f5231897 100644 --- a/Dockerfile-frankenphp +++ b/Dockerfile-frankenphp @@ -1,3 +1,37 @@ +# --- +# Build assets stage - runs on native platform (not emulated) +# This stage builds the frontend assets (JavaScript, CSS) using Node.js and Yarn +# The --platform=$BUILDPLATFORM ensures this stage runs on the native build platform (amd64) +# and not under emulation for ARM builds +FROM --platform=$BUILDPLATFORM composer:latest AS composer-deps + +WORKDIR /build + +# Copy entire project to install dependencies and generate translations +COPY . . + +# Install composer dependencies (needed for Symfony UX assets and cache warmup) +RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist --ignore-platform-reqs && \ + composer dump-autoload --no-dev --classmap-authoritative && \ + php bin/console cache:clear --no-warmup && \ + php bin/console cache:warmup + +# --- + +FROM --platform=$BUILDPLATFORM node:22-bookworm-slim AS assets + +WORKDIR /build + +# Copy entire project with vendor and generated translations from composer-deps stage +COPY --from=composer-deps /build ./ + +# Install dependencies and build assets +RUN yarn install --network-timeout 600000 && \ + yarn build && \ + yarn cache clean + +# --- + FROM dunglas/frankenphp:1-php8.4 AS frankenphp_upstream RUN apt-get update && apt-get -y install \ @@ -13,33 +47,6 @@ RUN apt-get update && apt-get -y install \ zip \ && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/*; -RUN set -eux; \ - # Prepare keyrings directory - mkdir -p /etc/apt/keyrings; \ - \ - # Import Yarn GPG key - curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg \ - | tee /etc/apt/keyrings/yarn.gpg >/dev/null; \ - chmod 644 /etc/apt/keyrings/yarn.gpg; \ - \ - # Add Yarn repo with signed-by - echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian stable main" \ - | tee /etc/apt/sources.list.d/yarn.list; \ - \ - # Run NodeSource setup script (unchanged) - curl -sL https://deb.nodesource.com/setup_22.x | bash -; \ - \ - # Install Node.js + Yarn - apt-get update; \ - apt-get install -y --no-install-recommends \ - nodejs \ - yarn; \ - \ - # Cleanup - apt-get -y autoremove; \ - apt-get clean autoclean; \ - rm -rf /var/lib/apt/lists/* - # Install PHP RUN set -eux; \ @@ -90,10 +97,8 @@ RUN set -eux; \ composer run-script --no-dev post-install-cmd; \ chmod +x bin/console; sync; -RUN yarn install --network-timeout 600000 && \ - yarn build && \ - yarn cache clean && \ - rm -rf node_modules/ +# Copy pre-built assets from the assets stage +COPY --from=assets /build/public/build ./public/build # Use docker env to output logs to stdout ENV APP_ENV=docker