Distroless Images: Obat Obesitas Untuk Container

Ketika kita sedang melakukan build image, salah satu hal yang bikin kita kesal adalah image size yang besar, tentu ini sangat mengganggu karena bisa membuat proses delivery menjadi lebih lama dan juga membuat registry server menjadi cepat penuh.
Dalam praktik production grade cluster, hal tersebut juga kurang bagus karena worker server harus menjalankan image dengan ukuran besar, tentu ini sangat tidak efisien, membuang banyak storage resource dan cenderung bloated.
Terus solusinya gimana?
Tenang, gunakan saja distroless images 🤩
Apa itu distroless images ?
Distroless / Minimal Images adalah base image yang dirancang se-minimal, se-kecil, dan se-ringan mungkin untuk menjalankan service inti dan dependensi penting untuk runtime saja, tidak termasuk komponen yang tidak diperlukan, seperti Package Manager, Shell, dan utilitas baris perintah seperti curl, wget, ls, dll. Dengan membuang semua hal yang tidak diperlukan, tidak heran ukuran image menjadi sangat kecil bahkan hanya beberapa ~MiB saja.
Istilah Distroless ini dipopulerkan oleh sebuah proyek yang dikembangkan oleh tim di Google, kemudian proyek ini dikelola secara publik pada git repository berikut :
Gimana cara pakainya?
Mengutip dari repo mereka, sudah ada beberapa runtime umum yang sudah siap pakai, seperti java dan nodejs,
Image | Tags | Architecture Suffixes |
---|---|---|
gcr.io/distroless/static-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |
gcr.io/distroless/base-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |
gcr.io/distroless/base-nossl-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |
gcr.io/distroless/cc-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |
gcr.io/distroless/python3-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64 |
gcr.io/distroless/java-base-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le |
gcr.io/distroless/java17-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le |
gcr.io/distroless/java21-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, ppc64le |
gcr.io/distroless/nodejs20-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |
gcr.io/distroless/nodejs22-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, arm, s390x, ppc64le |
gcr.io/distroless/nodejs24-debian12 | latest, nonroot, debug, debug-nonroot | amd64, arm64, s390x, ppc64le |
cara menggunakannya sama saja, kita bisa mengambilnya dengan cara pull image seperti biasa, atau kita definisikan pada Containerfile, misal saya mau menggunakan java21
podman pull gcr.io/distroless/java21-debian12
jika menggunakan Containerfile
FROM gcr.io/distroless/java21-debian12
WORKDIR /app
COPY ./build/*.jar /app/app.jar
CMD ["java -jar app.jar"]
kita juga bisa membuatnya sendiri dengan menggunakan base image tanpa runtime kemudian meraciknya sendiri sesuka hati kita menyesuaikan runtime yang kita gunakan, misal golang.
Perbandingan
Berikut perbandingan ukuran image jika menggunakan distroless dan tidak

terlihat, ukurannya sangat berbeda jauh, bahkan untuk base image tanpa runtime hanya ~3MiB saja, sedangkan untuk base image dengan runtime java menggunakan versi yang sama yaitu 21, ukurannya sangat jauh.
Kesimpulan
Menggunakan distroless image sangat direkomendasikan untuk klaster skala produksi (production grade cluster), ini merupakan salah satu tahapan tuning yang sangat bagus untuk diterapkan pada container.