Containerize your first Go Lang App using Docker
Does size matter?
It does – in production. Most orchestration solutions involve a smoother transitions from one docker image to other. A simple up command, if downloading only ~10MB of file, obviously it will save few seconds – but not just that, what about limited size we have in our production servers? This normally leads to the regular cleanups which is usually a manual and tedious tasks. So, for a scalability point of view, a multi-stage build approach is preferred over usual.
The Multi stage build Approach
Most of the approaches are quite poor as it ends up with a large docker image. New approach involves having a two steps approach as following:
You build Go in this system and use that to build your application. This will result in an insane size of docker image ~ from 200MB to 300MB
You copy the build from first step and this ensures size of final docker image is less. I bet you will have no more than 10MB image size.
# The Build FROM golang:alpine AS the-build ADD . /src RUN cd /src && go build -o app # Copy Build FROM alpine WORKDIR /app COPY --from=the-build /src/app /app/ ENTRYPOINT ./app
Here you are naming the first step of the build as ‘the-build’ Docker supports a partial build on multi-build process. So if you would like to build till ‘the-build’ you can do it with:
docker build --target the-build -t github/go-app:latest
If you omit –target – you can build the whole system in a single command as following:
docker build -t github/go-app:latest