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-nginx
Bu 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.conf
Bu 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-nginx
Bu 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 bash
Bu 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;
CMD
komutu, konteyner çalıştırıldığı zaman çalıştırılacak varsayılan komutları belirtirkenENTRYPOINT
komutu, konteyner çalıştırılırken çalıştırılacak komutları belirtir.CMD
komutudocker run
komutunda belirtilen komutlar tarafından geçersiz kılınabilirkenENTRYPOINT
komutudocker run
komutunda belirtilen komutlarentrypoint
komutunun 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
shell
formunda 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 yanipid1
bu shell process’i olur. - Eğer komut
exec
formunda girildiyse, Docker herhangi bir shell çalıştırmaz ve komut direkt process olarak calışırak container’inpid1
’i o process olur. exec
formunda çalıştırılan komutlar herhangi bir shell processi çalıştırmadığı için Environment Variable gibi bazı değerlere erişemezler.- Eğer
ENTRYPOINT
veCMD
birlikte kullanılacaksaexec
form kullanılmalıdır. Shell formu kullanıldığındaCMD
’deki komutlarENTRYPOINT
’e parametre olarak aktarılmaz.
Örnek vermek gerekirse;
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.
Fakat 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: