개요

Dockerfile에서 ENTRYPOINTCMD가 무슨 역할을 하는지를 알아보고 두가지 명령어의 차이점에 대해서 알아봅니다.

Untitled

ENTRYPOINT

ENTRYPOINT는 컨테이너가 시작될 때 실행할 명령을 정의합니다. 첫번째 인자는 실행할 명령어를 의미하고 나머지 인자들은 매개변수를 의미합니다.

1FROM centos:7
2ENTRYPOINT ["echo", "Hello, Penguin"]

위에 처럼 수행을 하게 되면 아래처럼 echo 명령어에 인자로 “Hello, Penguin” 을 받아서 출력하게 됩니다.

1$ docker run hello-world
2Hello, Penguin

CMD

CMDENTRYPOINT 에 전달되는 기본 매개변수를 제공하거나 ENTRYPOINT 가 제공되지 않았을 때 실행할 기본 명령을 정의합니다.

간단한 Dockerfile을 작성하다보면 CMD 혹은 ENTRYPOINT로 둘중 하나만 선택하게 됩니다. 그래서 두 명령어가 비슷한 의미로 쓰인다고 생각할 수 있는데 정확하게 말하면 CMDENTRYPOINT의 보조역할을 하고 있습니다. 밑에 예시 코드를 보면 좀 더 이해가 되실 수 있습니다.

위에 작성했던 Hello, Penguin!!! 코드는 ENTRYPOINTCMD를 조합하면 이렇게 작성할 수 있습니다.

CMD가 ENTRYPOINT의 매개변수로 사용

1FROM centos:7
2CMD ["Hello Penguin!!!"]
3ENTRYPOINT ["echo"]
1$ docker run hello-world
2Hello, Penguin!!!

CMD가 단독으로 사용되어 명령어로 사용

1FROM centos:7
2CMD ["echo", "Hello Penguin!!!"]
1$ docker run hello-world
2Hello, Penguin!!!

위에 설명했던 것 처럼 CMDENTRYPOINT의 매개변수로 사용되거나 단독으로 사용되었을 때 실행할 기본명령을 정의하는 역할이 됩니다.

사용 예시

ENTRYPOINTCMD의 이러한 특성을 이용해서 다음과 같은 작업을 할 수 있습니다.

  • ENTRYPONT는 echo 명령을 실행하면서 수행
  • CMD는 echo 인자에 들어가는 기본값을 설정 : Hello, World!
  • docker 수행시 인자값으로 Penguin을 전달하면 CMD의 값을 사용자 인자 값으로 오버라이딩 합니다.

방금 전 CMD 예시를 들면서 작성했던 코드를 조금 수정해서 붙여보겠습니다.

1FROM centos:7
2CMD ["Hello, World"]
3ENTRYPOINT ["echo"]

이렇게 수행이 되어있을 때 docker 수행시 “Hello, Penguin” 이라는 값을 넘겨주면 CMD의 값이 무시되고 사용자가 입력한 값으로 대체됩니다.

1$ docker run hello-world
2Hello, World
3
4$ docker run hello-world 'Hello, Penguin'
5Hello, Penguin

사용 예시에 대해서 정리하자면 CMD는 유연하게 요청에 대해서 처리할 수 있고 사용자가 실행시점에 명령을 쉽게 변경할 수 있습니다. 반면 ENTRYPOINT는 컨테이너가 특정 명령을 실행하도록 강제합니다

CMD/ENTRYPOINT 상관관계

CMDENTRYPOINT의 상관관계를 표로 정리하면 아래와 같습니다.

No ENTRYPOINTENTRYPOINT exec_entry p1_entryENTRYPOINT [“exec_entry”, “p1_entry”]
No CMDerror, not allowed/bin/sh -c exec_entry p1_entryexec_entry p1_entry
CMD [“exec_cmd”, “p1_cmd”]exec_cmd p1_cmd/bin/sh -c exec_entry p1_entryexec_entry p1_entry exec_cmd p1_cmd
CMD exec_cmd p1_cmd/bin/sh -c exec_cmd p1_cmd/bin/sh -c exec_entry p1_entryexec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

정리

해당 글을 통해서 CMDENTRYPOINT에 대해서 개념과 차이점에 대해서 알아보았습니다. 실무에서 사용하게 되면 크게 고민없이 ENTRYPOINT만 사용하거나 CMD만 사용하는 경우들이 있는데 적절하게 잘 조합해서 유연한 컨테이너를 만들어보시면 좋을 것 같습니다