Docker CMD ve ENTRYPOINT Komutları
Docker cmd ve entrypoint komutları, Dockerfile içinde belirli bir konteyner için çalıştırılacak komutları tanımlayan iki farklı anahtardır. Bu yazımızda bu iki komutun detaylarına bakacağız.
1. Docker ENTRYPOINT Komutu Nedir?
Docker ENTRYPOINT komutu, konteyner başlatıldığında çalıştırılacak komutu belirtir. Ayrıca, docker run komutunda belirtilen komutlar ENTRYPOINT komutunun parametreleri olarak eklenir. Bu, konteyneri çalıştırırken ENTRYPOINT komutunun parametrelerini değiştirmek için docker run komutunu kullanmanızı sağlar.
ENTRYPOINT işlevinin iki syntax'ı vardır:
Tercih edilen form olan exec formu:
ENTRYPOINT ["executable", "param1", "param2"]shell formu:
ENTRYPOINT command param1 param2Şimdi örnek olarak, bir web sunucusu çalıştırmak için bir konteyner oluşturalım ve ENTRYPOINT komutu olarak nginx kullanalım:
FROM nginx:latest
ENTRYPOINT ["nginx", "-g", "daemon off;"]Yukarıdaki Dockerfile'ı kullanarak konteyneri oluşturalım:
$ docker build -t my-nginx .Bu konteyneri çalıştıralım
$ docker run -d -p 80:80 my-nginxBu komut, nginx komutunu daemon off parametresiyle birlikte çalıştırır ve konteyner arka planda çalışmaya devam eder.
Ancak, konteyneri çalıştırırken nginx komutunun parametrelerini değiştirmek isteyebilirsiniz. Örneğin, nginx komutunu -c /etc/nginx/nginx.conf parametresiyle çalıştırmak isteyebilirsiniz. Bu durumda, docker run komutunu şöyle kullanabilirsiniz:
$ docker run -d -p 80:80 my-nginx -c /etc/nginx/nginx.confBu komut, nginx komutunu -g "daemon off;" ve -c /etc/nginx/nginx.conf parametreleriyle çalıştırır ve konteyner arka planda çalışmaya devam eder.
Bu örnekte gördüğünüz gibi ENTRYPOINT komutu, konteyneri çalıştırırken komutun parametrelerini değiştirmenizi sağlar ve docker run komutunu kullanarak konteyneri çalıştırırken ENTRYPOINT komutunun parametrelerini değiştirebilirsiniz.
2. Docker CMD Komutu Nedir?
Docker CMD komutu, konteyner başlatıldığında çalıştırılacak varsayılan komutu belirtir. Bu komut, docker run komutunda belirtilen komutlar tarafından geçersiz kılınabilir.
CMD işlevinin iki syntax'ı vardır:
Tercih edilen form olan exec formu:
CMD ["executable", "param1", "param2"]shell formu:
CMD command param1 param2Örnek olarak, bir web sunucusu çalıştırmak için bir konteyner oluşturalım ve CMD komutu olarak nginx -g "daemon off;" kullanalım:
FROM nginx:latest
CMD ["nginx", "-g", "daemon off;"]Bu Dockerfile'ı kullanarak konteyneri oluşturalım:
$ docker build -t my-nginx .Bu konteyneri çalıştıralım
$ docker run -d -p 80:80 my-nginxBu komut, nginx -g "daemon off;" komutunu çalıştırır ve konteyner arka planda çalışmaya devam eder.
Ancak, konteyneri çalıştırırken farklı bir komut çalıştırmak isteyebilirsiniz. Örneğin, bash komutunu çalıştırmak isteyebilirsiniz. Bu durumda, docker run komutunu şöyle kullanabilirsiniz:
$ docker run -it my-nginx bashBu komut, bash komutunu çalıştırır ve konteynerdaki terminal ekranına erişmenizi sağlar.
Bu örnekte gördüğünüz gibi CMD komutu, konteyneri çalıştırırken varsayılan olarak çalıştırılacak komutları belirtir ancak docker run komutunu kullanarak konteyneri çalıştırırken CMD komutunu geçersiz kılabilirsiniz.
3. Docker ENTRYPOINT ve CMD Komutlarının Farkı Nedir?
Docker cmd ve entrypoint komutları, Dockerfile içinde belirli bir konteyner için çalıştırılacak komutları tanımlayan iki farklı key'dir ve birbirine çok benzemektedir. Genellikle de birbirleriyle çok karıştırılır. Fakat şu farklarını anlamanız, komutları anlamanızı kolaylaştıracaktır;
CMDkomutu, konteyner çalıştırıldığı zaman çalıştırılacak varsayılan komutları belirtirkenENTRYPOINTkomutu, konteyner çalıştırılırken çalıştırılacak komutları belirtir.CMDkomutudocker runkomutunda belirtilen komutlar tarafından geçersiz kılınabilirkenENTRYPOINTkomutudocker runkomutunda belirtilen komutlarentrypointkomutunun parametreleri olarak eklenir.
4. Docker Komutunda Exec ve Shell Form Farkı Nedir?
Dockerfile CMD komutunda exec ve shell formunu kullanırken dikkat etmelisiniz. Aksi halde Dockerfile istediğiniz şekilde çalışmayabilir. Aşağıdaki farkları dikkatli okumanızı tavsiye ederiz:
- Eğer komut
shellformunda girilirse, Docker bu imajdan container yaratıldığı zaman bu komutu varsayılan shell’i çalıştırarak onun içerisinde girer. Bu nedenle container'da calisan 1. Process yanipid1bu shell process’i olur. - Eğer komut
execformunda girildiyse, Docker herhangi bir shell çalıştırmaz ve komut direkt process olarak calışırak container’inpid1’i o process olur. execformunda çalıştırılan komutlar herhangi bir shell processi çalıştırmadığı için Environment Variable gibi bazı değerlere erişemezler.- Eğer
ENTRYPOINTveCMDbirlikte kullanılacaksaexecform kullanılmalıdır. Shell formu kullanıldığındaCMD’deki komutlarENTRYPOINT’e parametre olarak aktarılmaz.
Örnek vermek gerekirse;
FROM ubuntu
ENV BLOG="Kerteriz Blog"
CMD ["echo", "$BLOG"]Eğer yukarıda olduğu gibi CMD komutunu exec formatında çalıştırırsanız container'ı çalıştırdığınızda ekrana sadece "$BLOG" yazar.
FROM ubuntu
ENV BLOG="Kerteriz Blog"
CMD echo $BLOGFakat yine yukarıda olduğu gibi CMD komutunu shell formatında çalıştırırsanız container'ı çalıştırdığınızda ekrana "Kerteriz Blog" yazar.
Docker derslerine sıradaki yazı ile devam edebilirsiniz:
