Standardowy obraz PHP-FPM z aplikacją Symfony ma zazwyczaj 600–800 MB. Z multi-stage build da się to obciąć do ~250 MB bez tracenia funkcjonalności.
Założenia
- Composer zainstaluje paczki w osobnym etapie i przekopiujemy tylko
vendor/. - Encore zbuduje assety w etapie z Node, do finalnego obrazu trafia tylko
public/build/. - Finalny obraz to
php:8.3-fpm-alpinebez build deps.
Dockerfile
FROM composer:2 AS composer
WORKDIR /app
COPY composer.* symfony.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
FROM node:20-alpine AS assets
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
COPY assets ./assets
COPY webpack.config.js ./
RUN yarn build
FROM php:8.3-fpm-alpine
WORKDIR /var/www
COPY --from=composer /app/vendor ./vendor
COPY --from=assets /app/public/build ./public/build
COPY . .
RUN composer dump-autoload --optimize --no-dev
Efekt
Obraz schodzi z 720 MB do ~260 MB. Cache layerów w CI też znacznie lepiej działa, bo zmiany w kodzie aplikacji nie inwalidują instalacji Composera ani Yarn.