Docker Build Cache Nedir? CI/CD Süreçlerinde Build Süresi Nasıl Azaltılır?

1 Yanıt 6 Görüntülenme
Puanlayanlar
Katılımcılar
Konuyu Açan #1
Docker ile uygulama geliştirenlerin sık karşılaştığı sorunlardan biri, küçük bir kod değişikliğinden sonra bile image oluşturma işleminin gereğinden uzun sürmesidir.
Özellikle GitHub Actions, GitLab CI veya Jenkins gibi CI/CD araçlarıyla çalışan projelerde her build sırasında aynı bağımlılıkların tekrar indirilmesi ve aynı işlemlerin yeniden yapılması zaman ve kaynak kaybına neden olabilir.
Peki Docker Build Cache nasıl çalışır ve doğru kullanıldığında build süreleri nasıl azaltılabilir?

Docker Build Cache Nasıl Çalışır?

Docker, Dockerfile içerisindeki talimatları işlerken önceki build işlemlerinden yararlanabilir. Bir katmanın girdileri ve ilgili koşullar değişmemişse Docker bu katmanı önbellekten kullanabilir.
Örneğin aşağıdaki Dockerfile yapısını inceleyelim:
KOD
123456789FROM node:22-alpine

WORKDIR /app

COPY . .

RUN npm install

CMD ["npm", "start"]

Bu örnekte kaynak kodda yapılan küçük bir değişiklik bile
KOD
1COPY . .

talimatını etkileyebilir. Bunun sonucunda
KOD
1npm install

katmanı yeniden çalıştırılabilir.
Daha iyi bir yaklaşım, bağımlılık dosyalarını kaynak koddan önce kopyalamaktır.

Daha Verimli Dockerfile Örneği

KOD
1234567891011FROM node:22-alpine

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm ci

COPY . .

CMD ["npm", "start"]

Bu yapıda
KOD
1package.json

ve
KOD
1package-lock.json

değişmediği sürece bağımlılıkların kurulduğu katman yeniden kullanılabilir.
Böylece yalnızca uygulama kodu değiştiğinde gereksiz yere bütün bağımlılıkları tekrar yüklemek zorunda kalınmaz.

.dockerignore Dosyasını Unutmayın

Docker build sırasında gereksiz dosyaların gönderilmesi de süreci yavaşlatabilir.
Proje kök dizininde aşağıdaki gibi bir
KOD
1.dockerignore

dosyası oluşturulabilir:
KOD
12345node_modules
.git
.env
dist
coverage

Bu liste projeye göre düzenlenmelidir. Özellikle
KOD
1.env

gibi gizli bilgilerin build context içine girmesini önlemek önemlidir.

CI/CD Ortamında Build Cache Kullanımı

Yerel bilgisayarda cache kullanmak kolaydır. Ancak CI/CD sistemlerinde her build işlemi yeni bir makinede veya geçici bir ortamda çalışabilir. Bu durumda önceki build katmanları otomatik olarak kullanılabilir durumda olmayabilir.
Docker Buildx ile registry tabanlı cache kullanılabilir:
KOD
12345docker buildx build \
  --cache-from=type=registry,ref=myregistry/myapp:buildcache \
  --cache-to=type=registry,ref=myregistry/myapp:buildcache,mode=max \
  -t myregistry/myapp:latest \
  --push .

Buradaki örnekte registry adresi ve image adları kendi ortamınıza göre değiştirilmelidir. Registry erişimi ve gerekli yetkilendirme önceden yapılandırılmalıdır.
KOD
1mode=max

, yalnızca son image katmanlarını değil, ara build katmanlarını da cache olarak dışa aktarmaya yardımcı olur.

Build Süresini Azaltmak İçin Diğer Öneriler

  • Dockerfile talimatlarını cache kullanımına uygun sıraya koyun.
  • Gereksiz dosyaları
    KOD
    1.dockerignore

    ile build context dışında tutun.
  • Bağımlılıkları sabit sürümler ve lock dosyalarıyla yönetin.
  • BuildKit özelliklerinden yararlanın.
  • Paket yöneticilerinin indirme cache'lerini uygun durumlarda kullanın.
  • Cache'in gerçekten işe yarayıp yaramadığını build logları üzerinden ölçün.
  • Güvenlik güncellemelerini yalnızca cache'i korumak amacıyla ertelemeyin.

Sonuç

Docker build performansı yalnızca sunucunun işlemci gücüne bağlı değildir. Dockerfile tasarımı, build context boyutu, bağımlılık yönetimi ve CI/CD cache stratejisi de önemli rol oynar.
Doğru yapılandırılmış bir cache sistemi, tekrarlanan işlemleri azaltarak geliştirme ve deployment süreçlerini hızlandırabilir.
Siz CI/CD süreçlerinizde hangi yöntemi kullanıyorsunuz?
  1. Docker Build Cache
  2. Docker Buildx ve Registry Cache
  3. GitHub Actions veya GitLab CI cache özellikleri
  4. Her build işleminde sıfırdan image oluşturma
Kullandığınız yöntemi ve karşılaştığınız performans sorunlarını yorumlarda paylaşabilirsiniz.
● WEBMASTER ●
Hayatın anlamı bir noktalı virgülde gizlidir.
« every fix is a win »
#DevMood
#2
Ellerine sağlık
A6d55tm

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi