Docker multi-stage build dla aplikacji PHP — recepta

Jak wycisnąć z obrazu Dockera kilkadziesiąt megabajtów dzięki multi-stage build i osobnym etapom dla Composer i Encore.

D #PHP

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-alpine bez 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.

Potrzebujesz wsparcia w projekcie?

Zbudujemy to razem.

Pomagamy firmom przekuwać pomysły w działający kod — backend, frontend, integracje, AI.

Porozmawiajmy →