Dockerfile for Go

Each time I start a new Go project, I repeat many steps.
Like set up .gitignore, CI configs, Dockerfile, …

So I decide to have a baseline Dockerfile like this:

FROM golang:1.18beta1-bullseye as builder

WORKDIR /build

COPY go.mod .
COPY go.sum ….


This content originally appeared on DEV Community and was authored by Young Yoshie

Each time I start a new Go project, I repeat many steps.
Like set up .gitignore, CI configs, Dockerfile, ...

So I decide to have a baseline Dockerfile like this:

FROM golang:1.18beta1-bullseye as builder

WORKDIR /build

COPY go.mod .
COPY go.sum .
COPY vendor .
COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOAMD64=v3 go build -o ./app main.go

FROM gcr.io/distroless/base-debian11

COPY --from=builder /build/app /app

ENTRYPOINT ["/app"]

I use multi-stage build to keep my image size small.
First stage is Go official image,
second stage is Distroless.

Before Distroless, I use Alpine official image,
There is a whole discussion on the Internet to choose which is the best base image for Go.
After reading some blogs, I discover Distroless as a small and secure base image.
So I stick with it for a while.

Also, remember to match Distroless Debian version with Go official image Debian version.

FROM golang:1.18beta1-bullseye as builder

This is Go image I use as a build stage.

WORKDIR /build

COPY go.mod .
COPY go.sum .
COPY vendor .
COPY . .

I use /build to emphasize that I am building something in that directory.

The 4 COPY lines are familiar if you use Go enough.
First is go.mod and go.sum because it defines Go modules.
The second is vendor because I use it a lot, this is not necessary but I use it because I don't want each time I build Dockerfile, I need to redownload Go modules.

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOAMD64=v3 go build -o ./app main.go

This is where I build Go program.
CGO_ENABLED=0 because I don't want to mess with C libraries.
GOOS=linux GOARCH=amd64 is easy to explain, Linux with x86-64.
GOAMD64=v3 is new since Go 1.18,
I use v3 because I read about AMD64 version in Arch Linux rfcs. TLDR's newer computers are already x86-64-v3.

FROM gcr.io/distroless/base-debian11

COPY --from=builder /build/app /app

ENTRYPOINT ["/app"]

Finally, I copy app to Distroless base image.


This content originally appeared on DEV Community and was authored by Young Yoshie


Print Share Comment Cite Upload Translate Updates
APA

Young Yoshie | Sciencx (2021-12-19T04:46:17+00:00) Dockerfile for Go. Retrieved from https://www.scien.cx/2021/12/19/dockerfile-for-go/

MLA
" » Dockerfile for Go." Young Yoshie | Sciencx - Sunday December 19, 2021, https://www.scien.cx/2021/12/19/dockerfile-for-go/
HARVARD
Young Yoshie | Sciencx Sunday December 19, 2021 » Dockerfile for Go., viewed ,<https://www.scien.cx/2021/12/19/dockerfile-for-go/>
VANCOUVER
Young Yoshie | Sciencx - » Dockerfile for Go. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/12/19/dockerfile-for-go/
CHICAGO
" » Dockerfile for Go." Young Yoshie | Sciencx - Accessed . https://www.scien.cx/2021/12/19/dockerfile-for-go/
IEEE
" » Dockerfile for Go." Young Yoshie | Sciencx [Online]. Available: https://www.scien.cx/2021/12/19/dockerfile-for-go/. [Accessed: ]
rf:citation
» Dockerfile for Go | Young Yoshie | Sciencx | https://www.scien.cx/2021/12/19/dockerfile-for-go/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.