Kategorien
Docker Entwicklung Server Webapplikationen

Kleinere Docker Images erstellen, aber wie?

Das haben wir uns in den letzten Wochen auch immer mal wieder gefragt und eine ganze Weile verschiedenste Wege ausprobiert, bis wir für uns eine sehr gute Lösung gefunden haben.

Schauen wir uns dies einmal an einem einfachen Beispiel an. Hierbei handelt es sich um eine einfache Software die in Go geschrieben wurde. Diese soll nun über zum Docker Hub hochgeladen werden. Dabei nehmen wir uns nun einmal das Projekt echGo als Vorlage.

Schauen wir uns erst einmal das Dockerfile an:

FROM golang:latest

ADD VERSION .

COPY . /go/src/app
WORKDIR /go/src/app

RUN go get ./
RUN go build -o app

CMD ./app

Bauen wir nun das Docker Image für den Container und laden dieses auf Docker Hub hoch, dann werden wir merken, dass die komprimierte Größe bereits 343,18 MB erreicht hat. Dies sind ca 900 MB, wenn man das Image heruntergeladen hat.

Da die Software an sich schon nicht so groß ist, muss es an dem geladenen Docker Image liegen. Wir haben das golang:latest genutzt.

Nun schauen wir uns einmal das überarbeitete Dockerfile an:

FROM golang:alpine AS build

RUN apk --no-cache add git

COPY . /tmp/go/src/app
WORKDIR /tmp/go/src/app

RUN go get ./
RUN go build -o echgo

FROM alpine:latest AS scratch

COPY --from=build /tmp/go/src/app /go/src/app
WORKDIR /go/src/app

CMD ["./echgo"]

Hier sehen wir, dass wir nun das golang:alpine für das Bauen der Software nutzen und danach das ganze mit dem alpine:latest Image betreiben werden.

Die beiden Images sind relativ klein, da sie nur den „nötigsten Inhalt“ mitbringen. Da wir nun auch erst das Image mit einem größeren Image bauen und danach mit einem kleineren Image betreiben, ist das finale Image für den Docker Container nur noch 7,4 MB groß. Dies ist die komprimierte form im Docker Hub.

Da die hier genutzten Images nicht immer für alle Zwecke ausreichen, kann es sein, dass Sie einige Pakete für das bauen oder das betreiben des Containers nachinstallierten müssen.

Dies könnten Sie wie folgt machen:

FROM golang:alpine AS build

RUN apk --no-cache add git build-base

...

Nun können Sie deutlich kleinere Docker Images für Ihre Container erstellen!

Wir hoffen, dass wir Ihnen mit diesem kleinen Tutorial weiterhelfen konnten. Bei Fragen schreiben Sie und gerne an info@jj-ideenschmiede.de.

Von Jonas Kwiedor

Full- Stack Developer aus Hamburg. Liebt es sich mit Schnittstellen & Automationen auseinander zu setzen und sich mit der Programmiersprache GO Lang zu beschäftigen.