Multistage Dockerbuild with Docker-Compose

Share on facebook
Share on google
Share on twitter
Share on linkedin
Durch Multistage builds in Dockerfiles ein leichtgewichtiges Image erstellen für eine Go Anwendung. Inkl. Frontend mit Webserver ~16MB / 137Mb

Einleitung

Mit Docker kann man leichtgewichtige Images mit einer Applikation erstellen um diese schnellst möglich von A nach B zu bringen.

Ein solches Image sollte im Idealfall wenige Megabytes gross sein und schnellst möglich starten. Genau für dies eignet sich Docker.

Doch Vorsichtig, auch mit Docker hat man einiges zu Beachten, den aus einer Applikation welche nicht grösser ist als wenige MB, kann schnell ein Image entstehen mit mehreren hundert MB bis hin zu über 1Gb.

Ziele

Am Ende dieses Atickels:

  • Verstehst du die Basics für den Einsatz von Multistage builds in docker-compose
  • Weisst du wie du das nächste Docker-Compose File schreibst für deine Anwendung(en)

Voraussetzungen

Als erstes benötigst du:

Du findest den ganzen Code in dem go-multistage-builder Repository

Frontend

Ich benutze ein Bereits erstelltes FrontEnd welches ich auf GitHub habe

Siehe Hier: https://github.com/GrolimundSolutions/2vault-frontend

Backend

Als Backend nutze ich ebenfals eine kleine Applikation welche ich auf GitHub Hoste. Diese ist in GO geschrieben und benutzt das GoGin Framework

Siehe Hier: https://github.com/GrolimundSolutions/2vault

Der Plan

Es sollen 2 Container entstehen, welche aber möglichst klein bleiben (+1 Zusätzliches Layer). Diese Sollten Untereinander Kommunizieren und Arbeiten können. Die Frontend Applikation sollte aufgerufen werden können.

Umsetzung

Das Dockerfile für das Backend entspricht genau dem selben wie ich bereits hier beschrieben habe: How To build Multistage Dockerfile for GO

Nun erstellen wir noch eine Dockerfile für das Builden des Frontends

Dies erstelle ich in deployments\docker\frontend

FROM alpine:latest AS builder
# install git
RUN apk add --no-cache git
WORKDIR /htdocs
RUN git clone https://github.com/GrolimundSolutions/2vault-frontend.git .

FROM httpd:latest
COPY --from=builder /htdocs /usr/local/apache2/htdocs

Bei diesem Build liegt auch wieder der grosse Vorteil das die ganzen Ausführungen zu mehreren Layern im Image fürt, diese bleiben aber in dem builder Image und die benötigten Daten werden anschliessend mit COPY --from=builder /htdocs /usr/local/apache2/htdocs in das eigentliche Zielimage kopiert was nur +1 zusätzliches Layer erzeugt.

Wir haben nun also 2 Dockerfiles einmal eines für das Backend und einmal eines für das Frontend. Nun fehlt nur noch das Docker-Composefile für das verknüpfen dieser 2 Dockerfiles.

version: "3.7"
services:

  # Backend
  backend:
    build: .
    ports:
      - "8080:8080"
    networks:
      - vaultnet

  # Frontend
  frontend:
    build: ./deployments/docker/frontend
    ports:
      - "8081:80"
    networks:
      - vaultnet

networks:
  vaultnet:

Starten kann man dies nun mit docker-compose up. Dies erstellt die beiden Images Pullt den Sourcecode verarbeitet diesen und Kopiert es in das Endgültige Image.

Docker Images Übersicht

In dem Obenstehenden Bild ist gut zu erkennen, das das Hinzufügen des Frontendpackets lediglich 0.03Mb benötigt hat. Hätte man dies alles auf einem Image macht, so wären aus diesen 137Mb schnell 500Mb geworden.

Achim

Achim

Die reinste Form des Wahnsinns ist es, alles beim Alten zu lassen und gleichzeitig zu hoffen, dass sich etwas ändert!

Schreibe einen Kommentar

Haben Sie Fragen

Zögern Sie nicht und Kontaktieren Sie und über unser Kontaktformular