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