optimasi ukuran docker image

Optimasi Ukuran Docker Image dengan Multi-stage Build

Dalam dunia pengembangan perangkat lunak modern, docker image dan Docker telah menjadi salah satu teknologi paling populer untuk membuat, mendistribusikan, dan menjalankan aplikasi secara konsisten di berbagai lingkungan.

Salah satu tantangan utama dalam menggunakan Docker adalah ukuran image yang dihasilkan sering kali besar dan berisi banyak layer tidak perlu.

Image yang besar dapat menyebabkan waktu deploy lebih lama, penggunaan bandwidth lebih tinggi, serta konsumsi storage yang tidak efisien.

Oleh karena itu, mengoptimasi ukuran Docker image menjadi hal yang penting untuk diperhatikan. Salah satu teknik yang sangat efektif untuk tujuan ini adalah menggunakan multi-stage build.

Apa Itu Multi-stage Build?

Multi-stage build adalah fitur pada Dockerfile yang memungkinkan kita menggunakan beberapa tahap build (stages) dalam satu Dockerfile.

Dengan multi-stage build, kita dapat memisahkan proses build aplikasi dan hasil akhir yang dibutuhkan untuk menjalankan aplikasi ke dalam beberapa tahap berbeda.

Hal ini memungkinkan kita hanya menyimpan artefak yang benar-benar diperlukan di image akhir, sementara semua file build dan dependensi yang tidak perlu dapat diabaikan dan tidak masuk ke dalam image akhir.

Bagaimana Cara Kerja Multi-stage Build?

Pada Dockerfile biasa, biasanya kita memulai dengan satu base image, misalnya node atau golang, lalu menginstall semua dependensi dan melakukan build aplikasi dalam satu stage. Semua itu termasuk file-file temporary, cache, dan tools build akan tetap ada di image akhir, sehingga ukurannya besar.

Dengan multi-stage build, kita bisa menuliskan beberapa tahap build.

Contohnya, tahap pertama menggunakan image lengkap yang punya semua tool build.

Kemudian, tahap kedua menggunakan image yang jauh lebih ringan, misalnya alpine atau scratch, dan hanya menyalin hasil build dari tahap pertama ke tahap kedua.

Contoh Dockerfile dengan multi-stage build untuk aplikasi Go:

# Tahap pertama: build aplikasi
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# Tahap kedua: image akhir yang lebih kecil
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

Pada contoh di atas, tahap builder menggunakan image golang:1.20-alpine yang sudah lengkap dengan tool build Go.

Setelah aplikasi selesai di-build, kita beralih ke tahap kedua yang menggunakan alpine:latest, sebuah image yang sangat kecil, dan hanya menyalin binary myapp yang sudah jadi dari tahap builder.

Dengan demikian, image akhir hanya berisi binary aplikasi tanpa tool build atau file tambahan yang tidak diperlukan.

Keuntungan Multi-stage Build

  1. Ukuran Image Lebih Kecil
    Karena hanya artefak yang diperlukan saja yang disalin ke tahap akhir, ukuran image bisa jauh lebih kecil dibandingkan build biasa.
  2. Keamanan Lebih Baik
    Image akhir tidak mengandung tool build atau file yang bisa berpotensi dieksploitasi.
  3. Proses Build yang Lebih Bersih
    File temporary dan cache build tidak ikut masuk ke image akhir sehingga mengurangi risiko error akibat file yang tidak diinginkan.
  4. Kemudahan Manajemen Dockerfile
    Semua proses build dapat diatur dalam satu Dockerfile yang rapi dan mudah dimengerti.

Kesimpulan

Optimasi ukuran Docker image sangat penting untuk meningkatkan efisiensi deployment dan menghemat sumber daya. Multi-stage build adalah teknik yang sangat efektif dan mudah diterapkan untuk mencapai hal ini.

Dengan memanfaatkan multi-stage build, pengembang dapat memisahkan proses build dan runtime, hanya menyimpan hasil akhir yang benar-benar diperlukan dalam image, sehingga ukuran image menjadi lebih ramping, lebih aman, dan lebih cepat di-deploy.

Jika Anda belum mencoba multi-stage build, saatnya mulai mengimplementasikannya dalam workflow Docker Anda dan rasakan manfaat signifikan dalam performa aplikasi dan efisiensi resource.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top