[Docker]

[Docker] CMD vs ENTRYPOINT

고밉 2022. 9. 12. 00:29
반응형

이전글 에서도 말했듯이 컨테이너는 프로세스가 종료되면 내려간다. 그 프로세스를 지정하는게 CMD , ENTRYPOINT 명령어다.

이 두개의 명령어는 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 지정하는 녀석들이다.

두개의 가장 큰 차이점이라면 실행 명령어를 오버라이드 할수 있냐 없냐다. 

더 상세하게 나가기 전에 실행 명령어부터 보자

1. 실행 명령어 형태. Shell vs Exec

두개의 명령어는 최종적으로 두 형태중 하나의 형태를 가지게 된다.

1-1. Shell Form

<Instruction> [command]
CMD echo "Hello world"
ENTRYPOINT echo "Hello world"

1-2. Exec From

<Instruction> ["executable", "parameter"]
CMD ["echo", "Hello world"]
ENTRYPOINT ["echo", "Hello world"]

2. CMD

다음과 같은 도커 파일이 있다고 하자

FROM ubuntu
RUN apt-get update
CMD ["echo", "Hello cmd"]

이미지 빌드

이미지 실행해보면 추가적인 명령어를 작성하지 않아서 도커파일에 작성해둔 Hello CMD가 출력되는걸 확인할 수 있다.

근데 위에서 한번 언급했듯이 CMD는 실행 명령어를 오버라이드 할수 있다 했다. 다음과 같이 뒤에 추가적인 echo 명령어를 사용하면 확인할 수 있다.


3. ENTRYPOINT

해당 명령어를 설명하기 위해 필요한 도커파일을 만들어보자

FROM ubuntu
RUN apt-get update
ENTRYPOINT ["echo", "Hello Entrypoint"]

이미지 빌드

이미지 실행해보면 CMD와 같이 echo 명령어가 실행되는 것을 확인할 수 있다.

자 그러면 CMD 처럼 뒤에 파라미터를 추가하면 어떻게 될까?

CMD와 달리 뒤에 echo "overriding"이라는 명령어가 뒤에 추가된것을 볼수 있다.

정말 ENTRYPOINT 명령어를 오버라이딩 하고 싶다면 docker run 할시에  --entrypoint 를 추가해주면된다.


4. CMD vs ENTRYPOINT

오버라이딩이 되지 않는 ENTRYPOINT에 대해서 이야기하자면 약간의 동작원리를 알아야하는데, 기본적으로 ENTRYPOINT는 실행가능한 명령어 예를 들어 echo와 같은 명령어를 지정해버린다.

위의 오버라이딩한 결과를 보면, 기존의 Hello Entrypoint라는 명령어 뒤에 echo overriding이라는 텍스트가 추가되서 출력되는 것을 볼수 있다. 해당 Dockerfile에서 내가 "echo"라는 실행명령어를 지정했기 때문이다. 그래서 그 뒤로는 무슨 값이 오든 전부 echo 당하는거다.

만약 아래와 같은 도커파일이 있다고 하면, 

FROM ubuntu
RUN apt-get update
ENTRYPOINT ["echo"]

이미지 빌드

빌드된 이미지를 실행해보면 echo라고 명령어만 지정했기 때문에 아무것도 출력되지 않는걸 볼수있다.

대신 위에서 오버라이딩 테스트 한것처럼 뒤에 텍스트를 추가하면 정상적으로 출력이 된다.

그래서 보통은 만약 CMD와 ENTRYPOINT를 같이 써야하는 경우가 생긴다면, 명령어를 ENTRYPOINT로 지정하고 CMD로 파라미터를 전달해서 사용한다.

FROM ubuntu
RUN apt-get update
ENTRYPOINT ["echo"]
CMD ["mix"]

이러면 컨테이너를 구동할당시에 언제든지 파라미터값을 바꿔서 실행시킬 수 있다.


References:

728x90