Docker Multi Stage Build

Selamlar arkadaşlar bu yazımda sizlere Dockerfile ayarlamaları yaparken kullanabileceğimiz bir yöntem olan Multi Stage Build’i anlatacağım.

Multi Stage Build, Docker Image’larınızı oluştururken birden fazla Build aşamasını tek bir Dockerfile içinde tanımlamanıza olanak sağlar. İlk aşamada oluşturulan geçici Container içerisinde bağımlılıkların, araçların ve kaynak dosyaların olduğu bir alan oluşturulur ve sonrasındaki aşamalarda ise bu alan kullanılarak asıl image’ınızın boyutunu küçültmüş ve gereksiz dosyalardan arınmış bir şekilde oluşturmanızı sağlar.

Bu örneği yaparken ise Java programlama dilinden yararlanarak basit bir “Merhaba Dünya” yazdıran bir uygulamayı Multi Stage Build olarak ele alacağım arkadaşlar. Aşama aşama aşağıdaki adımları uygulayacağız.

Ubuntu üzerine Deault-JDK kuracağız ve yazmış olduğumuz programı çalıştıracağız arkadaşlar.

> apt update
> sudo apt install default-jdk

Komutları ile default jdk’yi yüklüyoruz. Bu sayede ubuntu cihazımızda artık Java ile yazılan programlarımızı çalıştırabileceğiz.

> nano main.java

public class main {
    public static void main(String[] args) {
        System.out.println("Merhaba, Dünya!");
    }
}

> java main.java

İlk olarak nano ile main.java dosyamızı girdim ve bir alt satırdaki komutlarımızı buraya girdim. Burada önemli olan dosyanızın adı ile public class adınızın aynı olması. Java yazmadığım için nedenini bilmesemde çalıştırmaya çalıştığınızda programı bu hatayı alarak düzeltim. Sonrasında ise java komutu ile dosyamı çalıştırdım ve Merhaba, Dünya! yazısını gördüm. Yani ufacık java kodlarımız çalışıyor. Şimdi bunu Docker tarafında image’lara bölelim.

İlk olarak Multi Stage uygulamadan direk Image oluşturup çalıştıracağım ve Image boyutunu size göstereceğim. Ardından Multi Stage Build yaparak ne kadar küçüldüğünü ve komudumuzu çalıştırabildiğimizi sizlere göstereceğim arkadaşlar.

Main. Java dosyamızla birlikte aynı klasörde Dockerfile dosyamı oluşturup içerisine nano ile girdim ve aşağıdaki satırları yazdım.

FROM openjdk:11
WORKDIR /uygulama
COPY main.java /uygulama
# Java derlemesinin yapıldığı alan
RUN javac main.java
# Java uygulamasının çalıştırıldığı kısım
CMD ["java", "main"]

Base image olarak openjdk:11 ile çalışıyorum. /uygulama klasörü çalışma alanımız ve main.java dosyamı buraya kopyalıyorum. Sonrasında derleme ve çalıştırma aşamalarını giriyorum ve image’ımızı build edebiliriz. Bunuda aşağıdaki komut ile yapıyorum ve sonrasında container’ımı çalıştırıp sonucunu görüyorum.

> docker image build -t single-java .
> docker container run single-java

Şimdi ise Multi Stage yapı ile yeni bir Dockerfile oluşturup tekrar bir image oluşturacağım.

Main. Java dosyamızla birlikte aynı klasörde multi-Dockerfile dosyamı oluşturup içerisine nano ile girdim ve aşağıdaki satırları yazdım.

# Birinci asama
FROM openjdk:11 AS build
WORKDIR /uygulama
COPY main.java /uygulama
RUN javac main.java

# Ikinci asama
FROM openjdk:11-jre-slim
WORKDIR /uygulama
COPY --from=build /uygulama/main.class /uygulama
CMD ["java", "main"]

İlk aşamada base olarak openjdk:11 kullandım çünkü bu aşamada javac ile yazdıklarımızı derleyecektir ve AS build diyerek aşamamın adını vermiş oldum.

İkinci aşamada ise daha az yer kaplaması adına openjdk:11-jre-slim kullandım. JRE, java ile yazılan programların çalıştırılması için yeterli olduğundan dolayı onu kullandım ve COPY aşamasında –from=build aşamasında oluşturulan ve /uygulama klasöründe bulunan main.class dosyamızı yine /uygulama klasörüne taşıdım. Yani bu sayede ilk aşamada oluşturulan dosyalarımızı geçici Container’dan alıp bir sonraki aşamaya geçirdik ve Image’ımıza dahil etmiş olduk. Son olarak ise CMD ile komudu çalıştırmasını söyledim. Sonrasında aşağıdaki komutlarımız ile Build ve Run işlemlerini yapabiliriz. Sonuç olarak Merhaba Dünya! yazısı gelmiştir ve Container’larımız çalışmıştır.

> docker image build -t multi-java -f multi-Dockerfile .
> docker container run multi-java

Şimdi ise oluşturulan bu Image’ların boyutlarına bakalım Multi Stage işe yaramış mı?

> docker image ls -a

Komudumuz sayesinde cihazımızdaki Image’ları listeledik ve multi-java ile single-java; image’ları listelendi. SIZE alanını kontrol ederseniz, single-java’nin boyutunun 654MB olduğunu, multi-java’nın ise 223MB olduğunu göreceksiniz. Multi Stage sayesinde Image size’ında küçültme sağlamış olduk arkadaşlar.

Yazımın sonuna geldim arkadaşlar. Umarım yararlı olmuştur sizlere. Sorularınızı, görüşlerinizi yorumlar alanından bana iletmeyi unutmayın arkadaşlar. Destek sağlamak isterseniz ise Google reklamlarıma tıklayabilir ve YouTube üzerinde SistemDostu kanalıma abone olabilirsiniz. Kolaylıklar dilerim herkese.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir