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?
Örneğin aşağıdaki Dockerfile yapısını inceleyelim:
Bu örnekte kaynak kodda yapılan küçük bir değişiklik bile
talimatını etkileyebilir. Bunun sonucunda
katmanı yeniden çalıştırılabilir.
Daha iyi bir yaklaşım, bağımlılık dosyalarını kaynak koddan önce kopyalamaktır.
Bu yapıda
ve
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.
Proje kök dizininde aşağıdaki gibi bir
dosyası oluşturulabilir:
Bu liste projeye göre düzenlenmelidir. Özellikle
gibi gizli bilgilerin build context içine girmesini önlemek önemlidir.
Docker Buildx ile registry tabanlı cache kullanılabilir:
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.
, yalnızca son image katmanlarını değil, ara build katmanlarını da cache olarak dışa aktarmaya yardımcı olur.
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?
Ö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 installkatmanı 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.jsonve
KOD
1package-lock.jsondeğ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.dockerignoredosyası oluşturulabilir:
KOD
12345node_modules
.git
.env
dist
coverageBu liste projeye göre düzenlenmelidir. Özellikle
KOD
1.envgibi 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?
- Docker Build Cache
- Docker Buildx ve Registry Cache
- GitHub Actions veya GitLab CI cache özellikleri
- Her build işleminde sıfırdan image oluşturma
● WEBMASTER ●
Hayatın anlamı bir noktalı virgülde gizlidir.
« every fix is a win »
#DevMood
Hayatın anlamı bir noktalı virgülde gizlidir.
« every fix is a win »
#DevMood

