ETC/Docker

[Docker] RUN, CMD, ENTRYPOINT 차이점

seokhyun2 2021. 1. 10. 18:37

도커파일 작성 시에, 사용할 수 있는 명령어 중에 실행하는 것과 관련된 명령어는 RUN, CMD, ENTRYPOINT 세 가지가 있습니다.

 

세 명령어에 대한 차이점을 예시와 함께 확인해보도록 하겠습니다.

 

1. RUN

이 중에 RUN 명령어는 확연한 차이가 있습니다.

RUN 명령어는 도커파일로부터 도커 이미지를 빌드하는 순간에 실행이 되는 명령어입니다.

그래서, RUN 명령어는 라이브러리 설치를 하는 부분에서 주로 활용이 됩니다.

 

FROM python:3.7.9

RUN pip install -r requirements.txt

위와 같은 도커파일 예시에서, RUN 명령어를 활용하여 필요한 파이썬 라이브러리를 설치할 수 있습니다.

 

2. CMD

CMD 명령어는 RUN 명령어가 이미지를 빌드할 때 실행되는 것과 달리, 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행됩니다.

바로 아래 예시를 활용하여 확인해보도록 하겠습니다.

#dockerfile_cmd

FROM ubuntu:16.04

CMD ["echo", "CMD test"]

위와 같은 도커파일이 있을 때, 이미지를 빌드하고 실행해보도록 하겠습니다.

 

먼저, 아래 명령어로 이미지를 빌드합니다.

참고로 -f는 도커파일의 파일명을 지정하는 옵션이고, -t는 생성할 이미지의 이름을 지정하는 옵션입니다.

docker build . -f dockerfile_cmd -t cmd_test

 

이제 생성된 이미지를 아래와 같이 실행해보겠습니다.

docker run cmd_test

위의 명령어로 컨테이너를 생성하고 실행해보면, 컨테이너가 생성되서 CMD test라고 출력을 하고 컨테이너가 종료되는 것을 확인할 수 있습니다.

 

3. ENTRYPOINT

ENTRYPOINT는 CMD 명령어와 비슷합니다.

컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 지정합니다.

예시로 바로 확인해보도록 하겠습니다.

#dockerfile_entrypoint

FROM ubuntu:16.04

ENTRYPOINT ["echo", "ENTRYPOINT test"]

위와 같이 도커파일을 작성한 후에 이미지를 빌드하고 실행해보도록 하겠습니다.

 

docker build . -f dockerfile_entrypoint -t entrypoint_test
docker run entrypoint_test

이렇게 빌드하고 실행해보면 CMD 명령어처럼 ENTRYPOINT test라고 출력되는 걸 보실 수 있습니다.

 

4. CMD와  ENTRYPOINT 차이

여기까지만 보면, CMD와 ENTRYPOINT가 똑같아 보입니다.

하지만 차이점이 있으니까 구별이 되어 있겠죠?

차이점에 대해서 설명부터 드려보면 ENTRYPOINT는 항상 실행이 되고, CMD는 docker run 명령어를 실행할 때, 변경이 가능합니다.

 

그러면 위에서 만들었던 도커파일을 활용하여 어떻게 다른지 확인해보도록 하겠습니다.

docker run cmd_test echo hello

위와 같이 실행하면, cmd_test 이미지를 실행할 때, 추가로 echo hello 라는 command를 주는 것을 뜻합니다.

그리고 이렇게 실행해보면 위에서는 CMD test 대신에 hello가 출력되는 것을 볼 수 있습니다.

 

똑같이 entrypoint_test 이미지도 실행해보겠습니다.

docker run entrypoint_test echo hello

이 때는, ENTRYPOINT test echo hello라고 출력이 됩니다.

그 이유는 ENTRYPOINT에 뒤에 추가로 넣어줬던 echo hello가 붙어서 실행이 되기 때문입니다.

 

그래서, ENTRYPOINT는 컨테이너가 최초에 꼭 실행해야만 하는 명령어가 있을 때, CMD는 컨테이너 실행 시 시작되는 명령어지만 변경할 수 있을 때 활용하시면 됩니다.