CMD vs ENTRYPOINT & Multi-Stage Builds
1. Perbedaan CMD vs ENTRYPOINT
- CMD: Menentukan argumen/perintah default yang dapat ditimpa (overridden) dengan mudah saat
docker run. - ENTRYPOINT: Menentukan executable utama kontainer yang tetap dieksekusi sebagai biner utama.
# Kombinasi Praktis Terbaik:
ENTRYPOINT ["node"]
CMD ["app.js"]
# Jika dijalankan 'docker run my-image', eksekusi: node app.js
# Jika dijalankan 'docker run my-image test.js', eksekusi: node test.js
2. Multi-Stage Builds (Teknik Emas Produksi)
Dalam bahasa seperti Go, Rust, Java, atau Angular/React, kita membutuhkan SDK/Compiler yang besar saat build time, tetapi saat runtime produksi hanya membutuhkan file biner hasil kompilasi.
**Multi-Stage Build** memungkinkan penggunaan beberapa instruksi FROM dalam 1 Dockerfile untuk membuang seluruh alat compiler dan menghasilkan image produksi super kecil (beberapa MB saja)!
# Stage 1: Build Phase
FROM golang:1.26-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o main-app .
# Stage 2: Production Phase (Minimal Image)
FROM alpine:latest
WORKDIR /root/
# Salin HANYA file biner dari stage builder
COPY --from=builder /app/main-app .
EXPOSE 8080
CMD ["./main-app"]
๐ Hasil Optimasi: Ukuran image berkurang drastis dari **800 MB** (Golang SDK) menjadi hanya **15 MB** (Alpine + Binary)!