Dockerize Rust: Binary Boyutunu 10MB Altına Düşürme Teknikleri

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust uygulamalarını Dockerize ederken karşılaşılan en büyük sorun, varsayılan yöntemlerle oluşturulan imajların yüzlerce megabayt boyutuna ulaşmasıdır. Rust binary dosyaları doğası gereği büyüktür, ancak doğru tekniklerle bir web sunucusunu veya CLI aracını 10MB hatta 5MB seviyelerine indirebilirsiniz.
İşte adım adım Rust Docker optimizasyonu:

1. Multi-Stage Builds (Çok Aşamalı İnşalar)​

Docker'da boyutu düşürmenin ilk kuralı, derleme araçlarını (Rust derleyicisi, Cargo, kütüphaneler) son imajın dışında bırakmaktır. Sadece üretilen binary dosyasını hafif bir işletim sistemi katmanına taşırız.

2. Alpine Linux ve Musl Target​

Varsayılan Rust imajları glibc kullanır. Ancak Alpine Linux, çok daha küçük olan musl kütüphanesini kullanır. Uygulamanızı statik olarak linkleyerek Alpine üzerinde çalıştırabilirsiniz.
Dockerfile

Kod:
# 1. Derleme Aşaması
FROM rust:1.75-alpine AS builder
RUN apk add --no-cache musl-dev
WORKDIR /app
COPY . .
RUN cargo build --release

# 2. Çalıştırma Aşaması (Sadece 5MB!)
FROM alpine:latest
COPY --from=builder /app/target/release/uygulamam /uygulama
CMD ["/uygulama"]

3. "Scratch": Sıfır İşletim Sistemi​

Eğer uygulamanızın çalışma zamanında hiçbir harici bağımlılığı (shell, ssl sertifikaları vb.) yoksa, Docker'ın en küçük tabanı olan scratch kullanabilirsiniz. Bu imajın boyutu 0 byte'tır; imaj boyutu sadece sizin binary dosyanızın boyutu kadar olur.
Dikkat: scratch kullanmak için binary'nin tamamen statik olarak derlenmiş olması gerekir.

4. Cargo.toml Optimizasyonları​

Binary boyutunu Docker'a girmeden önce Rust seviyesinde küçültmek en etkili yöntemdir. Cargo.toml dosyanıza şu ayarları ekleyin:
Ini, TOML

Kod:
[profile.release]
opt-level = 'z'     # Boyut için optimize et (s yerine z en küçüğüdür)
lto = true          # Link Time Optimization (ölü kodu temizler)
codegen-units = 1   # Daha yavaş derleme ama daha küçük binary
panic = 'abort'     # Hata durumunda yığın izlemeyi (unwinding) kaldırır
strip = true        # Debug sembollerini siler (Binary boyutunu %50 düşürebilir)

5. UPX (Ultimate Packer for eXecutables)​

Eğer her şeyden sonra hala birkaç megabayt kazanmak istiyorsanız, UPX kullanabilirsiniz. UPX, binary dosyanızı sıkıştırır ve çalıştırıldığı anda bellekte açar.
  • Avantajı: 15MB'lık dosyayı 3-4MB'a düşürebilir.
  • Dezavantajı: Başlangıç süresini (startup time) milisaniye düzeyinde artırabilir.

Özet Strateji Tablosu​

YöntemYaklaşık BoyutZorluk
Standart Docker600MB+Çok Kolay
Multi-stage + Debian Slim80MB - 120MBKolay
Multi-stage + Alpine10MB - 20MBOrta
Scratch + Statik + Strip3MB - 8MBİleri

Profesyonel İpucu: SSL Sertifikaları​

scratch veya alpine kullanırken HTTPS istekleri yapacaksanız, imajınızda SSL sertifikaları bulunmayabilir. Bu durumda ca-certificates paketini eklemeyi unutmayın:RUN apk add --no-cache ca-certificates
 
Geri
Üst