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
- Ukuran Image Lebih Kecil
Karena hanya artefak yang diperlukan saja yang disalin ke tahap akhir, ukuran image bisa jauh lebih kecil dibandingkan build biasa. - Keamanan Lebih Baik
Image akhir tidak mengandung tool build atau file yang bisa berpotensi dieksploitasi. - 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. - 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.