In this tutorial I will show you how to build really small docker containers for golang applications. And I mean the difference between 310MB down to 2MB
But Alpine..
So we thinking lets go with alpine right? Yeah sure lets build a small, app running on go with alpine.
Our application code:
app.go
12345678910111213141516171819202122232425
packagemainimport("fmt""math/rand""time")funcmain(){lekkewords:=[]string{"dog","cat","fish","giraffe","moo","spider","lion","apple","tree","moon","snake","mountain lion","trooper","burger","nasa","yes",}rand.Seed(time.Now().UnixNano())varzelengthint=len(lekkewords)varindexnumint=rand.Intn(zelength-1)word:=lekkewords[indexnum]fmt.Println("Number of words:",zelength)fmt.Println("Selected index number:",indexnum)fmt.Println("Selected word is:",word)}
Our Dockerfile:
Dockerfile
1234567
FROM golang:alpine
WORKDIR$GOPATH/src/mylekkepackage/mylekkeapp/
COPY app.go .
RUN go build -o /go/app
CMD["/go/app"]
Let’s package our app to an image:
Dockerfile
1
❯ docker build -t mygolangapp:using-alpine .
Inspect the size of our image, as you can see it being 310MB
Dockerfile
123
❯ docker images "mygolangapp:*"REPOSITORY TAG IMAGE ID CREATED SIZE
mygolangapp using-alpine eea1d7bde218 About a minute ago 310MB
Just make sure it actually works:
Dockerfile
1234
❯ docker run mygolangapp:using-alpine
Number of words: 16Selected index number: 11Selected word is: mountain lion
But for something just returning random selected text, 310MB is a bit crazy.
Multi Stage Builds
As Go binaries are self-contained, we can make use of docker’s multi stage builds, where we can build our application on alpine and use the binary on a scratch image:
Our multi stage Dockerfile:
Dockerfile.mult
1234567891011
FROM golang:alpine AS builder
WORKDIR$GOPATH/src/mylekkepackage/mylekkeapp/
COPY app.go .
RUN go build -o /go/app
FROM scratch
COPY --from=builder /go/app /go/app
CMD["/go/app"]
❯ docker images "mygolangapp:*"REPOSITORY TAG IMAGE ID CREATED SIZE
mygolangapp using-multistage 31474c61ba5b 15 seconds ago 2.01MB
mygolangapp using-alpine eea1d7bde218 2 minutes ago 310MB
Run the app:
Dockerfile.mult
1234
❯ docker run mygolangapp:using-multistage
Number of words: 16Selected index number: 5Selected word is: spider