Masalah: Image yang Besar

Dockerfile sederhana seperti ini ternyata ngasilin image yang besar:

FROM golang:1.22.2-alpine3.19

WORKDIR /app
COPY . /app/

RUN apk add --no-cache curl tzdata
RUN cp /usr/share/zoneinfo/Asia/Jakarta /etc/localtime && echo "Asia/Jakarta" > /etc/timezone

RUN go mod tidy
RUN go build -o bin-apps main.go

EXPOSE 8080
CMD ["./bin-apps"]

Solusi: Multi-Stage Build

Dengan multi-stage build, proses dibagi menjadi dua tahap:

  1. Build Stage: Menggunakan image Go untuk membangun binary.
  2. Runtime Stage: Menggunakan image minimal untuk menjalankan binary.
# Stage 1: Build
FROM golang:1.22.2-alpine3.19 AS builder

WORKDIR /app
RUN apk add --no-cache tzdata
ENV TZ=Asia/Jakarta

COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o bin-apps main.go

# Stage 2: Final Image
FROM alpine:3.19

WORKDIR /app
RUN apk add --no-cache tzdata curl
ENV TZ=Asia/Jakarta

COPY --from=builder /app/bin-apps /app/bin-apps
EXPOSE 8080
CMD ["./bin-apps"]

Dengan multi-stage build:

  1. Image hanya berisi binary dan dependency runtime.
  2. Ukuran image berkurang drastis, di kasus saya dari 1 GB-an jadi 40 MB saja
Kuning Itu Image Lama, Merah image Setelah Dilakukan Multi Stage Build

Kuning Itu Image Lama, Merah image Setelah Dilakukan Multi Stage Build

Untuk image dengan project lain (non Go), silahkan baca post saya yg lain memperkecil Ukuran Docker Image dengan Slim (Slimtoolkit)