node.js Docker Imagegröße erheblich reduzieren

Docker ist bei uns bereits seit längerem in Produktivumgebungen im Einsatz. Wir arbeiten stets daran die Build Prozesse für die Docker Images und damit die resultierenden Images selbst zu optimieren.

Im Wesentlichen geht es um drei Punkte

  1. Das richtige Base Image
  2. Multistage-Builds
  3. Nur die notwendigen Dependencies nutzen

Das richtige Base Image

Die erste Optimierung mit erheblichem Ausmaß ist die Verwendung des richtigen Base Images. Das offizielle node Image gibt es in der *-alpine Variante. Alpine ist eine besonders kleine, schnelle und sichere Distribution. Es sind nur die nötigsten Tools installiert die für node.js benötigt werden. Es ist kein Texteditor oder sonstiges vorhanden!

Das Basis Image basierend auf Alpine ist nur noch knapp 20MB groß im Gegensatz zum „normalen“ Image mit fast 350MB.

Multistage-Builds

Seit Docker 17.05 gibt es die Möglichkeit seinen Build-Prozess in mehrere Phasen aufzuteilen. Ein Dockerfile könnte nun so aussehen:

## Builder Image
FROM node:10.15.0-alpine AS builder
WORKDIR /home/node/yourapp
COPY . .
RUN npm install && npm run build

## Production Image
FROM node:10.15.0-alpine
ENV NODE_ENV=production
WORKDIR /home/node/yourapp
COPY ./package*.json ./
RUN npm install && npm cache clean --force
COPY --from=builder /home/node/yourapp ./path/to/yourapp/dist
EXPOSE 443

CMD npm start

LABEL author="Oliver Güra"
LABEL maintainer="Farbenfroh Web und App Entwicklung GmbH"

Im ersten Schritt werden sämtliche Dependencies installiert und das Projekt gebaut. Im zweiten Schritt wird das Ergebnis aus dem ersten Schritt genutzt um ein schlankes Image zu erzeugen.

Nur die notwendigen Dependencies nutzen

Ein wichtiger Aspekt in der Entwicklung ist darauf zu achten, die Dependencies richtig in „devDependencies“ und „dependencies“ aufzuteilen. „Dev Dependencies“ sind Abhängigkeiten, die nicht zur Laufzeit benötigt werden. Dazu zählen zum Beispiel webpack, babel, jest und weitere. Wurde hier sauber gearbeitet, dann werden im finalen Image ausschließlich zur Laufzeit benötigte Abhängigkeiten im node_modules Ordner vorhanden sein.

Lob, Kritik, Anregungen?

Wir freuen uns auf Ihre Meinung


Ältere Posts dieses Autors