일일 정리

Dockerfile : CMD, ENTRYPOINT

mysecurity 2025. 6. 3. 12:50

목차

1. Dockerfile : CMD, ENTRYPOINT

1-1 CMD, ENTRYPOINT

1-2 CMD, ENTRYPOINT 차이점

 

 

1. Dockerfile : CMD, ENTRYPOINT

1-1 CMD, ENTRYPOINT

CMD와 ENRTYPOINT는 해당 이미지를 기반으로 생성되는 컨테이너에서 실행할 명령을 기술한다.

- CMD는 ENRTYPOINT와 달리 Dockerfile 내에 하나만 기술 가능하다. 애초에 원칙적으로 하나만 사용하며, 여려 개 기술할 경우 마지막 명령만 유효하다.

- Shell, Exec 방식으로 기술 가능하다.

 

● 동일 서비스 동시 제공

./dfile/Dockerfile의 내용은 다음과 같다. 마지막 줄 작성만 변화를 주어 이미지 4개를 생성한다.

FROM centos:8
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' \
            /etc/yum.repos.d/CentOS-*
RUN dnf install -y nginx

CMD ["nginx","-g","daemon off;"]          // myimage1
CMD nginx -g 'daemon off;'                // myimage2
ENTRYPOINT ["nginx","-g","daemon off;"]   // myimage3
ENTRYPOINT nginx -g 'daemon off;'         // myimage4

- 생성된 이미지 4개의 일은 nginx를 실행하는 것으로 모두 동일하다. 

 

다음과 같이 각 이미지를 이용해 다른 포트를 열어 같은 서비스를 동시에 제공할 수 있다.

 

 

1-2 CMD, ENTRYPOINT 차이점

CMD 명령은 docker run 문장에서 추가된 인자를 받아들이지 못하고 대체되나, ENTRYPOINT 명령은 docker run 문장에서 추가된 인자를 추가 옵션으로 받아들여 실행된다.

 

./dfile/Dockerfile의 내용은 다음과 같다. 마지막 줄 작성만 변화를 주어 이미지 2개를 생성한다.

 FROM centos:8
 
 CMD ["/bin/ping","localhost"]          // mypingimage1
 ENTRYPOINT ["/bin/ping","localhost"]   // mypingimage2

 

다음과 같이 일반적으로 실행 시 동일하게 정상 작동한다.

 

docker run 문장에 추가적으로 인자 입력 시 다음과 같은 차이가 발생한다.

- mypingimage1의 경우 CMD를 이용하였으므로 '-c 2'가 CMD 명령으로 대체되어 정상 작동하지 않는다.

- mypingimage2의 경우 ENTRYPOINT를 이용하였으므로 '-c 2'를 추가 옵션으로 받아들여 정상 작동한다.

 

● CMD, ENTRYPOINT 동시 사용

다음과 같이 ./dfile/Dockerfile의 ENTRYPOINT에는 명령을, CMD에는 인수를 지정해 사용 가능하다.

FROM centos:8           
ENTRYPOINT ["/bin/ping"]
CMD ["localhost","-c","2"]

- 이는 컨테이너 실행 시 docker run 문장에서 별도의 옵션이 없다면 디폴트 실행, 옵션이 있을 경우 옵션대로 실행하도록 한다.

 

다음과 같이 ./dfile/Dockerfile의 마지막 줄 작성만 변화를 주어 이미지 2개를 생성한다.

FROM centos:8
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' \
            /etc/yum.repos.d/CentOS-*
RUN dnf install -y nginx


CMD ["nginx","-g","daemon off;"]            // webimage1 생성
ENTRYPOINT ["nginx","-g","daemon off;"]     // webimage2 생성

 

이후 생성한 이미지를 이용해 ./dfile/Dockerfile의 첫 줄 작성만 변화를 주어 다시 이미지를 2개 생성한다.

FROM webimage1           // webimage11
FROM webimage2           // webimage22

RUN dnf install -y httpd
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]

 

다음과 같이 각각 컨테이너를 실행하여 차이를 확인할 수 있다.

- webimage1의 CMD명령어는 webimage11에서 지정된 CMD 명령에 의해 무시되므로 아파치가 정상 작동한다.

 

- webimage2의 ENTRYPOINT 명령어는 webimage22에서 지정된 CMD 명령을 옵션으로 받아들이므로 시스템이 정상 작동하지 않는다.

'일일 정리' 카테고리의 다른 글

[Final-Project] Sophos UTM을 활용한 방화벽 구축  (0) 2025.06.18
Dockerfile : 기타 명령어  (1) 2025.06.04
Dockerfile  (0) 2025.06.02
Docker image  (0) 2025.05.28
Data와 Volume  (1) 2025.05.26