Docker Üzerinde Çalışan Dotnet Uygulamasının Build Süreçlerini Hızlandırmak
Tags: optimization, dotnet, docker, performance
Published: 2021-04-18 20:56:37

---
title: Docker Üzerinde Çalışan Dotnet Uygulamasının Build Süreçlerini Hızlandırmak
published: true
date: 2020-07-13 16:41:26 UTC
tags: optimization,dotnet,docker,performance
canonical_url: https://medium.com/@brehpoint/docker-%C3%BCzerinde-%C3%A7al%C4%B1%C5%9Fan-dotnet-uygulamas%C4%B1n%C4%B1n-build-s%C3%BCre%C3%A7lerini-h%C4%B1zland%C4%B1rmak-30379c5251b1
---

![](https://cdn-images-1.medium.com/max/1024/1*9abYdEvIHGKJ-cQIiH9q3A.jpeg)

#### Dockerfile’ları düzenleyerek daha hızlı build işlemi nasıl gerçekleştirebiliriz?

### İçerik

- **Özsöz**
- **Problemin Tanımı**
- **Docker Build Anında Çalışan Cache Nedir ve Nasıl Yararlanacağız?**
- **Dotnet Uygulamasına Ait Dockerfile’ları Nasıl Yapılandırılabiliriz?**
- **Dotnet Uygulamasına Ait Örnek Dockerfile**
- **Use Case : Uygulamanın Docker İçerisinde Harici Başka Bir Uygulamaya veya Dış Kaynağa İhtiyaç Duyması**

### Önsöz

Bu yazı dotnet özelinde detaylar içermektedir fakat dotnet haricinde uygulama geliştirenlerde faydalanabilir. Derinlemesine incelenmesi gereken kaynakların bağlantılarını ve anahtar kelimelerini yazı içerisinde bulabilirsiniz. Aklınıza takılan sorular, eklemek veya düzeltmek istediğiniz yerler olursa bana paylaştığım [iletişim kanallarından](https://github.com./berkayakcay) ulaşabilirsiniz.

### Problemin Tanımı

En basitinden bir CI (Continuous Integration) pipeline’nına sahip olduğunuzu veya local olarak docker ile çalıştığınızı, build olan bir docker compose file’ımız olduğunu düşünelim.  
[_docker-compose_](https://docs.docker.com/compose/)

Çok fazla Dockerfile üzerinden imajlar oluştuğu için her seferinde bu imajların oluşmasını beklemeniz gerekmektedir. Bu süreci hızlandırmak için neler yapılmalıdır?

Yazıya devam etmeden önce Dockerfile içerisinde kullanılan Instruction’ları (komut) hatırlamak ve üzerinden geçmek için orijinal kaynağına bakabilir..

[Dockerfile reference](https://docs.docker.com/engine/reference/builder/)

.. veya [Gökhan Şengün](https://medium.com/u/9c61d8e925a7)’ün yazısından Türkçe olarak okuyabilirsiniz.

[Docker Bölüm 2: Yeni bir Docker Image'ı Nasıl Hazırlanır?](https://gokhansengun.com/docker-yeni-image-hazirlama/)

### Docker Build Anında Çalışan Cache Nedir ve Nasıl Yaralanacağız?

Kısaca docker build cache, build işlemini esnasında imaj içerisinde değişikliğe sebep olacak ADD, RUN vb. komutlardan sonra kontrollerini gerçekleştirip farklılıkları hesaplaması yapılan işlemden sonra oluşan aşamayı daha sonra kullanmak üzere saklamasıdır.

> Docker build cache doğru kullanıldığı zaman bize hız ve disk alanı kazandırır

Problemimizin çözümü için bizler bu cache yapısını mümkün olan en iyi şekilde kullanmaya çalışacağız.

### **Dotnet Uygulamasına Ait Dockerfile’ları Nasıl Yapılandırılabiliriz?**

- Dockerfile’ı karışımıza alıp build ederken sürekli değişmeyecek parçaları ayırmak.
- Mümkün olduğun kadar tüm değişmez stepler ile bir base imaj oluşturmak ve bu base imajları kullanmak.
- Değişken olan parçalar için değişme ihtimalinin sıklığına göre artan şekilde sıralamak.

![](https://cdn-images-1.medium.com/max/371/1*xszkZFCAl-93nWr3XwF2jg.jpeg)

Bir örnek vermek gerekir ise Dockerfile’ınız içerisinde sürekli olarak wget/apt-get ile çekip context’e eklediğini bir dosya veya kütüphane olduğunu düşünün.

Aşağıda SUPERVISORD’yi eklediğimiz base imajın içerisindeki layer oluşturacak bir komutun ekran görüntüsünü paylaşıyorum. Her imaj içerisinde ihtiyacımız olan bu harici uygulamayı içeren bir base imaj yarattık ve bunu kullanmaya başladık bu sayede sık değişmeyen bir step’i daha yukarı taşımış olduk.

![](https://cdn-images-1.medium.com/max/804/1*CKnu_5xKxkWq-5w-aM4sQQ.png)

> Konuya hızlı bir giriş yapmak için başta Multi-stage buildler ile alakalı [Ahmet Alp Balkan](https://medium.com/u/2cac56571879)’ın [youtube](https://youtu.be/FQS1p88Q0q8) videosunu ve diğer docker videolarını tavsiye ederim.

### Dotnet Uygulamasına Ait Dockerfile

Lütfen aşağıdaki Dockerfile’a bir göz atınız.

> COPY . .

olan kısma kadar **\*.sln** dosyamızı, var ise  **.nugetconfig** ’lerimizi ve **\*.csproj** dosyalarımı context’e ekliyoruz ve ardından **dotnet restore** komutumuzu çalıştırıyoruz.

Solution içerisinde aynı stepleri gerçekleştirecek bir çok Dockerfile’ınızı compose içerisinde build olması için tetikleyeceksiniz.

Bir defa değişmeyen kısımları cache’leyen docker build sonrakiler için çok daha hızlı çalışacak.

{% gist https://gist.github.com/berkayakcay/3b421444cdf889e9ec3fb748c2e82390 %}

> docker-compose build

komutu birden fazla kez çalıştırdığımızda bazı steplerin cache kullandığını aşağıdaki ekran görüntüsünde görebilirisiniz.

![](https://cdn-images-1.medium.com/max/1024/1*YeS5vI3jOVNyBGaU06rMEg.png)

Daha önce cache’e alınan bu stepler benzer bir katman oluştuğunda cache üzerinden çağırılarak kullanılır. Bu cache’ler build esnasında imajlar arasında ortak olarak kullanılırlar.

Örneğin;

![](https://cdn-images-1.medium.com/max/642/1*_0fvZ7CekhWv2MPo_POcow.png)<figcaption><em>eShopOnContainers-ServicesAndWebApps.sln</em></figcaption>

dosyasını kopyalandığı komut daha önce çalıştırıldığı için Using cache ile tekrar aynı komutun çalışmasına gerek kalmadan işletilmektedir.

### **Use Case : Uygulamanın Docker İçerisinde Harici Başka Bir Uygulamaya veya Dış Kaynağa İhtiyaç Duyması**

Örneğin,  
Dockerfile içerisinde ihtiyaçtan dolayı harici bir projeyi context’inize dahil etmeniz gerekirse belirli bir tag ile bu işlemi gerçekleştirmeniz sürekli aynı dosyaları almanızı sağlayacaktır.

> RUN git clone — branch <tag> <repository>

Yine benzer bir şekilde apt-get ve türevi bir paket yöneticisi ile bir paket kurar iken versiyon belirtmeniz daha doğru olacaktır.

> apt-get install <package name>=<version>

Bu tarz ihtiyaçlarınızı toparlayarak bir base imaj yaratmak ve kendi privite/public registry’leriniz üzerinde yayınlayıp oradan kullanmak daha faydalı olacaktır.

Örneğin sürekli ihtiyacımız olduğu için aşağıdaki gibi bir base imaj oluşturup etiketleyerek registry üzerine gönderdiğimiz bir imajımız bulunmaktadır.

{% gist https://gist.github.com/berkayakcay/9aef0ea0c6f95a86a584cda5c22f73e6 %}

İstediğiniz zaman benimle iletişime geçebilirsiniz. Tanışmak, ve fikir alışverişinde bulunmaktan memnuniyet duyarım.

[Twitter](https://twitter.com/brehpoint) — [Medium](https://medium.com/@brehpoint) — [Dev.to](https://dev.to/berkayakcay) — [Linkedin](https://www.linkedin.com/in/berkayakcay) — [Github](https://github.com/berkayakcay)