목차
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 |