Selamlar arkadaşlar bu yazımda sizlere Dockerfile oluştururken kullandığımız ADD, COPY, ENTRYPOINT, CMD gibi komutların farklarını ve EXEC ve SHELL formlarını anlatacağım. Bu sayede kullanımlarını daha dikkatli yapabilir ve kodlardan tam olarak yararlanabiliriz.
ADD ve COPY Farkı :
Komutlarımızın ikiside belirtilen klasörü ya da dosyayı image içerisinde belirtilen alanlara kopyalar. COPY cihazınızdan kopyalama yaparken, ADD uzak lokasyondan yani bir web sitesinden kopyalama yapabilir. Eğer dosyanız .tar.gz gibi sıkıştırılmış bir dosya ise COPY ile tar açılmadan kopyalanırken, ADD bu dosyayı açarak kopyalayacaktır.
İlk olarak bu kısımda basit bir Dockerfile oluşturuyorum.
İlk olarak dosyamın yanına wordpress’in dosyasını indiriyorum sonrasında o dosyanın yanında Dockerfile dosyamı oluşturuyorum. Daha sonra aşağıdaki kodları Dockerfile dosyamızın içerisine girerek ekliyorum.
FROM alpine:latest
WORKDIR /tmp
COPY wordpress-6.4.3-tr_TR.tar.gz .
ADD wordpress-6.4.3-tr_TR.tar.gz .
ADD https://tr.wordpress.org/latest-tr_TR.tar.gz .
> docker image build -t deneme .
Daha sonra bu Dockerfile’ımdan Image Build ediyorum.
> docker container run -it deneme sh
-it komutu ile cihazımıza bağlanarak container’ımızı çalıştırdık ve Dockerfile içerisinde yazan adımları yaptı. COPY komutu ile direk dosyamızı atarken. Aynı dosyayı ADD komutu ile tar dan çıkartarak attı ve ADD komudu ile Link üzerinden indirerek yaptı arkadaşlar. Bir önceki yazımdaki gibi WordPress kurmak isterseniz artık bu şekilde atarsınız 😛
ENTRYPOINT ve CM Farkı :
Komutlarımız ile image oluşturulduktan sonra container içerisinde yazdığımız komutları çalıştırıyor. Dockerfile içerisinde CMD ile bir satır oluşturursanız onu Run Time ortamında değiştirebiliyorken, ENTRYPOINT ile bir komut oluşturduğunuz zaman değiştiremiyorsunuz.
CMD [“ping”, “8.8.8.8”]
ENTRYPOINT [“ping”, “8.8.8.8”]
Komutarımızın ikiside aynı işlemi yapmaktadır. 8.8.8.8’e ping atacaklardır. Docker container run image_adı 127.0.0.1 şeklinde yazıp parametre vererek container çalıştırırsanız. CMD 127.0.0.1’e ping atmaya başlayacakken ENTRYPOINT tarafında ise herhangi bir değişiklik olmadan 8.8.8.8’e ping atmaya devam edecektir.
Ancak bu örneği aşağıdaki gibi yapmalısınız. CMD ve ENTRYPOINT’i bir arada kullandığınız örneklerde parametre ile CMD içerisinde yazanı değiştirebilirsiniz.
Dockerfile oluşturduk ve aşağıdaki şekilde Ping atmasını sağladığımız bir image’ımız olacak.
FROM centos:latest
ENTRYPOINT [“ping”]
CMD [“8.8.8.8”]
> docker image build -t pingimaj .
Daha sonra image’ımızı build ediyoruz.
> docker container run pingimaj
> docker container run pingimaj 192.168.0.1
İlk komudumuz parametresiz olarak direk Dockerfile içerisindeki ip adresine ping atarken, CMD değiştirmek için run komudumuzun sonuna eklediğimiz ip adresi ile parametre ekleyerek o adrese ping attırıyoruz.
NOT : Bu şekilde çalıştırabilmeniz için EXEC Formunda kullanmanız gerekiyor komutu.
EXEC ve SHELL Formlarının Farkı :
Shell formunda komutlar Dockerfile içinde doğrudan bir kabuk (shell) üzerinden yürütülür. /bin/sh -c gibi. ÖR : CMD ping 8.8.8.8
Exec formunda ise komutlar biz dizi olarak belirtilir. Ve Shell’e göre daha güvenlidir. Çünkü Dockerfile’ın çalıştığı ortama bağlı olmadığından daha tutarlı çalışır. ÖR : CMD [“ping”, “8.8.8.8”]
– Shell formu kullandığınız zaman komutlar, container oluşturulduğunda direk olarak Shell’de çalışır ve bundan dolayı container’ın ilk Process’i Shell gözükecektir.
– Exec formunda ise ilk process uygulamanız gözükecektir.
– Exec ile çalıştırılan komutlar container içerisinde tanımlı olan Enviorenment’lere erişemezler.
İlk olarak Dockerfile’larımı göstereyim size. Dockerfile; Exec Forma örnekken, Dockerfile1 ise Shell Form’a örnek.
> cat Dockerfile
FROM centos:latest
ENV TEST = “SistemDostu Docker Komutları”
CMD [“echo”, “$TEST”]
> cat Dockerfile1
FROM centos:latest
ENV TEST = “SistemDostu Docker Komutları”
CMD echo $TEST
Daha sonra bu file’lar ile Image build ediyoruz. Ben bu işlemi yaparken form yerine from yazmışım arkadaşlar o kısımları siz düzeltin 🙂
> docker container run shellfrom
> docker container run execfrom
Gördüğünüz üzere shell form ile envoirement çalışıyorken exec form ile container’ımız hata verdi.
Bu şekilde arkadaşlar. Yazımın daha sonuna geldim. Umarım yararlı bilgiler verebiliyorumdur. Soru ve görüşlerinizi bana yazımın altındaki yorum alanlarından iletebilir, destek olmak istersenizde YouTube üzerinde SistemDostu kanalıma abone olabilirsiniz.