Dockerize Golang App

Muhammad Abdur Rofi Maulidin 🇮🇩
Jawara Cloud
Published in
4 min readJan 18, 2022

--

Image by Todd Cravens

Assalamu’alaikum Warahmatullah Wabarakatuh,

Oke pada part3 ini kita akan coba bahas bagaimana caranya kita membuat docker images dari aplikasi golang kita sebelum kita deploy ke kubernetes cluser.

Sebelum kita mulai, pastikan terlelbih dahulu kita telah menginstall docker engine di local komputer kita. Okeh kalo udah diinstall langsung aja kita masuk ke tahap pembuatan Dockerfile.

Jadi struktur folder projectnya :

Dan ini Dockerfile yang aku bikin :

# Build Stage# Images yang digunakan untuk build binaryFROM golang:alpine as build# Environtment yang diperlukan menginstall packageENV GO111MODULE=on# Environtment yang diperlukan untuk nama userENV USER=appuser# Environtment yang diperlukan untuk user idENV UID=10001# Proses install package yang diperlukanRUN apk update && apk add --no-cache git ca-certificates && update-ca-certificates# Proses membuat userRUN adduser \--disabled-password \--gecos "" \--home "/nonexistent" \--shell "/sbin/nologin" \--no-create-home \--uid "${UID}" \"${USER}"# Proses menentukan working directoryWORKDIR /app# Copy file go.mod ke workdirCOPY ./go.mod .# Proses installasi module yang dibutuhkanRUN go mod download# Proses mengcopy semua file & folder yang akan dibuildCOPY . .# Environtment yang dibutuhkan dalam proses build binary appENV CGO_ENABLED=0 GOOS=linux GOARCH=amd64# Proses build binary golang appRUN go build -a -installsuffix cgo -ldflags="-s -w" -o main .# Wraping Stages# Images yang digunakan untuk wrap binaryFROM busybox# Proses menentukan working directoryWORKDIR /app# Meng-copy ca-certificatesCOPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/# Meng-copy passwd fileCOPY --from=build /etc/passwd /etc/passwd# Meng-copy group fileCOPY --from=build /etc/group /etc/group# Meng-copy binary app golangCOPY --from=build /app/main /app/main# Menganti user ke user appuserUSER appuser:appuser# Proses expose portEXPOSE 3000# Perintah yang akan pertama kali dijalankan pada saat container berjalanCMD [ "/app/main" ]

Dan ini isi file dari .dockerignore :

.github/*.kubernetes/*.gitignoreoutput.jsonREADME.mdmain_test.go

Okeh selanjutnya kita lanjut ke proses build Dockerfile ini menjadi docker images. Langsung aja kita jalanin perintah :

docker build . -t simple-http-app:latest

Output :

Sending build context to Docker daemon  510.5kBStep 1/21 : FROM golang:alpine as build---> d8bf44a3f6b4Step 2/21 : ENV GO111MODULE=on---> Using cache---> 9e17d05c95e8Step 3/21 : ENV USER=appuser---> Using cache---> 454333f81981Step 4/21 : ENV UID=10001---> Using cache---> 47524e3dd343Step 5/21 : RUN apk update && apk add --no-cache git ca-certificates && update-ca-certificates---> Using cache---> 4ad0e65a22a5Step 6/21 : RUN adduser     --disabled-password     --gecos ""     --home "/nonexistent"     --shell "/sbin/nologin"     --no-create-home     --uid "${UID}"     "${USER}"---> Using cache---> d314ff24944eStep 7/21 : WORKDIR /app---> Using cache---> b0be7d4dc8afStep 8/21 : COPY ./go.mod .---> Using cache---> 3a47a13d3cd1Step 9/21 : RUN go mod download---> Using cache---> e5972ad4feb5Step 10/21 : COPY . .---> 3dca5a2ac611Step 11/21 : ENV CGO_ENABLED=0 GOOS=linux GOARCH=amd64---> Running in b047f6f855ccRemoving intermediate container b047f6f855cc---> 8ad66335466cStep 12/21 : RUN go build -a -installsuffix cgo -ldflags="-s -w" -o main .---> Running in 9368f2b33819Removing intermediate container 9368f2b33819---> 10472b6cddffStep 13/21 : FROM busybox---> beae173ccac6Step 14/21 : WORKDIR /app---> Using cache---> 2abe9564862dStep 15/21 : COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/---> Using cache---> 720ca1a731f7Step 16/21 : COPY --from=build /etc/passwd /etc/passwd---> Using cache---> 14a4d7786490Step 17/21 : COPY --from=build /etc/group /etc/group---> Using cache---> d9073e7ff574Step 18/21 : COPY --from=build /app/main /app/main---> 1d17d57e962bStep 19/21 : USER appuser:appuser---> Running in 9bb09512be0dRemoving intermediate container 9bb09512be0d---> 3042e12c73f7Step 20/21 : EXPOSE 3000---> Running in de072f21fe05Removing intermediate container de072f21fe05---> cb8f322947e8Step 21/21 : CMD [ "/app/main" ]---> Running in 06fe93a49835Removing intermediate container 06fe93a49835---> 672395de6388Successfully built 672395de6388Successfully tagged simple-http-app:latest

Untuk mengetahui ukuran docker images tadi, kita bisa jalankan perintah docker images

Output :

REPOSITORY                    TAG                 IMAGE ID       CREATED              SIZEsimple-http-app               latest              672395de6388   About a minute ago   7.07MB

Wokeh, sudah selesai.

Selanjutnya kita lanjut ke part4, untuk membuat testing dari aplikasi golang kita.

See you~

About me

I’m Muhammad Abdur Rofi Maulidin, a DevOps Engineer passionate about optimizing software development processes by supporting cloud infrastructure management like kubernetes orchestration, and automations. Dedicated to support the reliability, availability, and performance of systems by implementing SLI/SLO based on performance monitoring for business requirement.

Feel free to keep in touch with me:

Let’s go to the cloud 🚀

Free Palestine 🇵🇸

--

--