본문 바로가기
IT/도커

6. CMD vs ENTRYPOINT

by 노오-력 2023. 1. 22.
$ docker run ubuntu

위 명령어를 실행하면 바로 종료된다.

 

ubuntu 이미지의 Dockerfile을 살펴보면

CMD로 bash 를 사용하는걸 볼 수 있다.

bash는 터미널에서 입력을 수신하는 셀인데

터미널을 찾을 수 없으면 종료한다.

 

docker는 기본적으로 실행될 때 컨테이너에 터미널을 연결하지 않는다.

그래서 bash 프로그램은 터미널을 찾지 못하고 종료되는것이다.

 

 

1. 컨테이너를 시작하기 위한 다른 명령어는 어떻게 지정할 수 있을까?

한 가지 옵션은 docker run 뒤에 명령어는 추가하는 것이다.

$ docker run ubuntu sleep 5

 

위와 같이 sleep 5 명령어를 추가하면

컨테이너가 시작될 때 sleep 프로그램을 실행하고 5초 후에 종료된다.

 

 

2. 어떻게 하면 이 변경 사항을 영구적으로 만들 수 있을까?

이미지가 시작될 때 항상 sleep 명령어를 실행하고 싶다면

위 Dockerfile과 같이

기본 Ubuntu 이미지에서 고유한 이미지를 만들고

새 명령어를 지정하면 된다.

명령어를 지정하는 방식에는

셸 형식 그대로 sleep 5를 사용하거나

오른쪽과 같이 JSON 배열 형식으로 사용할 수 있다.

JSON 배열 형식으로 지정할 때

배열의 첫 번째 요소는 실행 파일이어야한다는 점이다.

위 예시에서 실행 파일은 sleep 프로그램이 된다.

$ docker build . -t sleep-ubuntu

$ docker run sleep-ubuntu

위 Dockerfile을 빌드해서 새로운 이미지를 만들고 실행해 보면

$ docker run ubuntu sleep 5 와 동일한 결과를 얻을 수 있다.

 

 

 

그런데 여기서 추가적으로

3. sleep의 시간(초)를 변경하려면 어떻게 해야할까?

현재 sleep 5초로 하드코딩 되어 있다.

제일 간단한 방법은 그 위에 sleep 10 명령어로 덮어 씌우는 것이다.

$ docker run sleep-ubuntu sleep 10

하지만 sleep 단어가 중복이 되어 별로 좋아 보이지는 않는다.

sleep-ubuntu 이미지의 이름이 그 자체로 sleep 한다는 것을 의미하고 있다

 

 

아래와 같이 뒤에 시간만 전달하면 좋을 것 같은데

$ docker run sleep-ubuntu 10

이 때 사용되는것이 ENTRYPOINT 이다.

ENTRYPOINT는 CMD 와 비슷하게

컨테이너가 시작될 때 실행할 프로그램을 지정할 수 있다.

그래서 명령줄에서 지정하는 모든 항목이 ENTRYPOINT에 추가된다.

위 예시에서는 명령줄에서 지정한 '10'이

ENTRYPOINT인 sleep의 뒤에 추가되어

sleep 10 의 명령어가 컨테이너가 시작할때 실행된다.

 

 

하지만 위와 같이 ENTRYPOINT로 만든 이미지를

$ docker run sleep-ubuntu

뒤에 시간을 추가하지 않고 실행하면 오류가 발생한다.

 

4. 명령줄에 값이 지정되지 않았을 때 기본값을 어떻게 설정하면될까?

여기서 CMD와 ENTRYPOINT를 모두 활용하면 된다.

CMD 를 설정해 두면

명령줄에 매개변수가 지정되지 않았을 경우 '5'가 기본값으로 들어가

sleep 5가 된다.

 

반대로 명령줄에 매개변수를 지정했을 경우

$ docker run sleep-ubuntu 10

CMD가 무시되고 지정한 10이 들어가 sleep 10이 된다.

그러려면 항상 JSON형식으로 ENTRYPOINT와 CMD 로 지정해야한다.

 

 

 

 

 

 

 

'IT > 도커' 카테고리의 다른 글

8. docker registry  (0) 2023.01.25
7. docker compose  (0) 2023.01.25
5. 도커 환경변수  (0) 2023.01.22
4. 도커 이미지 생성, 푸쉬  (0) 2023.01.21
3. 도커 실행 관련(태그, 포트, 볼륨 매핑 등)  (0) 2023.01.19