Dockerfile을 통해 Docker 컨테이너를 실행하는 과정에서, 특정한 작업이나 애플리케이션의 프로세스를 실행시킬 때 RUN, CMD, ENTRYPOINT 명령어를 사용합니다. 각 명령어에 어떤 차이점이 있는지 알아보겠습니다.

RUN 명령어

먼저 RUN 명령어는 Dockerfile에서 이미지를 생성할 때 가장 많이 쓰이는 명령어로, 애플리케이션이나 패키지를 설치할 때 사용합니다. 기존 이미지 위에 새로운 레이어를 생성하는 명령어입니다.

FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y nginx

Dockerfile 예제에서는 Ubuntu 18.04 환경 위에 apt-get update 명령어로 패키지 업데이트를 한 다음, nginx를 설치합니다. 다만 위와 같은 Docker 이미지는 패키지 업데이트 및 애플리케이션 설치만 될 뿐, 어떠한 프로세스가 실행되지 않기 때문에 컨테이너가 정상적으로 동작하지 않습니다.

정상적으로 동작하는 Docker 이미지를 만들기 위해서는 컨테이너 내부에서 최종적으로 실행되는 프로세스를 CMD 또는 ENTRYPOINT 명령어로 정의해야 합니다.

CMD 명령어

컨테이너 내부에서 최종적으로 실행되는 프로세스의 명령어로, Docker CLI상에서 다른 명령어로 덮어씌울 수 있습니다.

FROM ubuntu:18.04
RUN apt-get update
CMD ["echo", "Hello, World"]

위 Dockerfile 예제를 이용하여 Docker 이미지를 빌드하고, docker run [이미지 이름] 명령어로 실행 시 실행 결과는 아래와 같이 CMD 명령어로 정의한 프로세스가 실행됩니다.

Hello, World

만약 이미지 빌드 후 docker run [이미지 이름] hostname 명령어로 실행할 경우, CMD 명령어로 정의한 프로세스가 아닌 hostname 프로세스만 실행되어 컨테이너의 호스트네임이 표시됩니다.

4aa43esdd984

ENTRYPOINT 명령어

CMD 명령어와 달리, Docker CLI상에서 다른 명령어로 덮어씌울 수 없습니다.

FROM ubuntu:18.04
RUN apt-get update
ENTRYPOINT ["echo", "Hello, World"]

위 Dockerfile 예제를 이용하여 Docker 이미지를 빌드하고, docker run [이미지 이름] 명령어로 실행 시 실행 결과는 아래와 같이 ENTRYPOINT 명령어로 정의한 프로세스가 실행됩니다.

Hello, World

만약 이미지 빌드 후 docker run [이미지 이름] hostname 명령어로 실행할 경우, ENTRYPOINT 명령어로 정의한 echo Hello, World 뒤에 hostname 명령어가 따라 붙어 함께 실행됩니다.

Hello, World 4aa43esdd984