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ı belirtirken ENTRYPOINT komutu, konteyner çalıştırılırken çalıştırılacak komutları belirtir.
  • CMD komutu docker run komutunda belirtilen komutlar tarafından geçersiz kılınabilirken ENTRYPOINT komutu docker run komutunda belirtilen komutlar entrypoint 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:

  1. 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 yani pid1 bu shell process’i olur.
  2. Eğer komut exec formunda girildiyse, Docker herhangi bir shell çalıştırmaz ve komut direkt process olarak calışırak container’in pid1’i o process olur.
  3. exec formunda çalıştırılan komutlar herhangi bir shell processi çalıştırmadığı için Environment Variable gibi bazı değerlere erişemezler.
  4. Eğer ENTRYPOINT ve CMD birlikte kullanılacaksa exec form kullanılmalıdır. Shell formu kullanıldığında CMD’deki komutlar ENTRYPOINT’e parametre olarak aktarılmaz.

Örnek vermek gerekirse;

FROM ubuntu
ENV BLOG="Kerteriz Blog"
CMD ["echo", "$BLOG"]
exec formatı

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 $BLOG
shell formatı

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:

Docker COPY ve ADD Komutları
Docker COPY ve ADD komutları ile dosya ve dizinleri konteynerlara kopyalayabilirsiniz.