hallo@webwilli.at
hallo@webwilli.at +43 676 9724611
Stefan Schoner
17.05.2023

Docker Multistage Build Prozess

Was bedeuted Multistage?

Es bedeutet, dass man im Dockerfile sich mehrerer fertiger Container bedient, um die Abhängigkeiten innerhalb eines Containers zu verringern.
Konkretes Beispiel: Wir möchten einen PHP Applikationscontainer builden, der das Frontend während dem Build mit Node/NPM generierten will.

Alte Vorgangsweise: Im PHP Container muss Node vorhanden sein, um während dem Build npm install & npm build ausführen zu können.
Neue Vorgangsweise: Ich lass im offiziellen Node Container npm install & npm build ausführen und kopiere das Ergebnis in den PHP Container.

Welche Vorteile hat das?

  • Anstatt über den Paket manager im PHP container node zu holen, kann man sich einfach eines offiziellen node images bedienen. Hier hat mat alle Versionen vefügbar und muss nicht hoffen, dass die jeweilige Distrubition (alpine, debian,...) das Paket verfügbar hat.
  • Es gibt kein Sicherheitsrisiko wegen node/npm, es ist im Applikationscontainer nicht vorhanden!
  • Es muss nicht der Applikationscontainer verändert werden, um die node/npm version upzudaten

Codebeispiel (Dockerfile)

## Single Container Build

FROM php:8.0.28-fpm-alpine3.16
#man muss sich verlasse, dass der package manager überhaupt gewünschtes paket hat
RUN apk update && apk add --update --no-cache  \
        nodejs \
        nodejs-npm

RUN npm install
RUN npm run prod
#Hier muss man dann node-modules löschen, etc etc..

## Multistage Build

FROM node:20 AS node
COPY ./your-source-folder ./
RUN npm install
RUN npm run prod

FROM FROM php:8.0.28-fpm-alpine3.16
...
COPY --from=node /pfad-des-ergebnisses-in-node /zielpfad-im-php-container
...

Fazit

Ich bin begeistert, wie einfach man per docker im Build prozess sich mehrere Services zusammenstöpseln kann und dann nur die Ergebnisse in den Applikationscontainer zu packen. Somit läuft produktiv exakt nur das, was man braucht, und nicht wie man es oft kennt alles was zum build benötigt wurde.

Webwilli
Webwilli