궁금한게 많은 개발자 노트

[ Dockerfile ] RUN, CMD, ENTRYPOINT 차이점 본문

DevOps

[ Dockerfile ] RUN, CMD, ENTRYPOINT 차이점

궁금한게 많은 개발자 2023. 7. 19. 15:43

Dockerfile을 작성하는 목적으로는 Docker에서 사용할 Image를 생성하기 위함입니다.

이 때 사용하는 아래 세가지 RUN, CMD, ENTRYPOINT 명령어는 이미지 생성 시에 실행과 관련된 명령어입니다. 각각의 세부적인 차이점을 정리하고자 합니다.

 

RUN

RUN 명령어는 Docker Image를 생성할 때 실행되는 명령어입니다.

즉, 이미지를 작성하기 위해 사용하는 명령어로 이미지 생성 시에 필요한 라이브러리를 설치할 때 주로 사용됩니다.

(FROM으로 지정한 이미지 위에서 새로운 Docker 이미지를 생성할 때 실행되는 명령어)

 

CMD

CMD와 ENTRYPOINT는 기본적으로 생성된 이미지가 컨테이너에서 실행될 때 수행할 명령을 정의하는 문법입니다.

생성된 이미지가 컨테이너에서 실행될 때 최초로 수행되는 명령어를 정의합니다.

위의 목적을 달성하는 것으로는 용도가 같은 문법이지만, 명확한 차이점은 존재합니다.

차이점으로는 항상 실행이 되는 것(ENTRYPOINT)과 실행 시에 변경이 가능한 것(CMD)의 차이입니다.

CMD로 Dockerfile에서 명령을 작성하였다 하더라도 Docker이미지를 컨테이너에서 실행할 때 인자를 주면 그것을 CMD로 인식하여 기존 CMD로 작성한 내용을 덮어쓰기하여 전달한 명령어가 CMD를 대신하여 실행됩니다.

 

ENTRYPOINT

생성된 도커 이미지가 컨테이너에서 실행될 때 반드시 수행되어야 하는 명령을 정의하는데 사용됩니다.

반드시 실행되어야 하는 명령의 default값을 주로 작성하며, 해당 명령의 옵션을 줄 때는 CMD와 혼합하여 사용할 수 있습니다. 변경되지 않을 명령어를 작성하기에는 ENTRYPOINT가 목적에 더 부합합니다.

 

도커 이미지를 만들 때는 실행 목적이 분명할 것이므로, nginx, app server등의 메인 명령어 실행을 ENTRYPOINT로 작성하고 명령어의 option은 CMD로 작성하여 default option을 넣어두고 변경이 가능하게 하면 활용도가 높을 것 같습니다.

 

즉, ENTRYPOINT와 CMD를 모두 지정할 시 명령어가 수행되는 순서로는 ENTRYPOINT명령 + CMD명령이 되므로 ENTRYPOINT는 메인 명령어, CMD는 옵션으로 사용할 수 있습니다.

 

 

추가로, ENTRYPOINT와 CMD는 List형태로 작성하는 것이 좋습니다. ["args1", "args2",...] 

이유는 어떤 script를 실행하고자 할 때, List형태로 작성하지 않으면 /bin/sh를 한번 거쳐 실행되는 반면에 List형태로 작성하면 /bin/sh를 거치지 않고 script가 바로 실행되어 한 단계 작업을 줄일 수 있습니다.

Comments