Dagimal (⌐ ͡■ ͜ʖ ͡■)

Distroless Images: Obat Obesitas Untuk Container

bloated image

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 :

https://github.com/GoogleContainerTools/distroless

Gimana cara pakainya?

Mengutip dari repo mereka, sudah ada beberapa runtime umum yang sudah siap pakai, seperti java dan nodejs,

ImageTagsArchitecture Suffixes
gcr.io/distroless/static-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, arm, s390x, ppc64le
gcr.io/distroless/base-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, arm, s390x, ppc64le
gcr.io/distroless/base-nossl-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, arm, s390x, ppc64le
gcr.io/distroless/cc-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, arm, s390x, ppc64le
gcr.io/distroless/python3-debian12latest, nonroot, debug, debug-nonrootamd64, arm64
gcr.io/distroless/java-base-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, s390x, ppc64le
gcr.io/distroless/java17-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, s390x, ppc64le
gcr.io/distroless/java21-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, ppc64le
gcr.io/distroless/nodejs20-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, arm, s390x, ppc64le
gcr.io/distroless/nodejs22-debian12latest, nonroot, debug, debug-nonrootamd64, arm64, arm, s390x, ppc64le
gcr.io/distroless/nodejs24-debian12latest, nonroot, debug, debug-nonrootamd64, 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

podman images

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.