컨테이너·워크플로우 자동화/DocKer 기본 및 활용

Dockerfile RUN vs CMD vs ENTRYPOINT: 실행 시점과 역할의 차이

Data Jun 2026. 2. 18. 10:11

Dockerfile에서 가장 많이 헷갈리는 세 가지 명령어는 RUN, CMD, ENTRYPOINT이다.
이 세 가지는 “언제 실행되는가”와 “덮어쓸 수 있는가”에서 본질적인 차이가 있다.

 

RUN은 이미지를 빌드할 때 실행되고,
CMD와 ENTRYPOINT는 컨테이너가 시작될 때 실행된다.

 

또한 CMD는 실행 시 변경할 수 있는 기본값이고,
ENTRYPOINT는 컨테이너의 고정 실행 프로그램이다.
둘을 함께 쓰면 CMD는 ENTRYPOINT의 인자 역할로 동작한다.

 

1. RUN vs CMD, ENTRYPOINT: 실행 시점 차이

 1) RUN

RUN npm install
  • 실행 시점: 이미지 빌드할 때
  • 목적: 이미지 안에 무엇인가를 설치하거나 준비

비유하면:

집을 지을 때 내부 공사를 하는 단계

 

컨테이너 실행과는 관계없다.

 

 2) CMD / ENTRYPOINT

CMD ["node", "app.js"]

ENTRYPOINT ["node", "app.js"]
  • 실행 시점: 컨테이너 시작할 때
  • 목적: 컨테이너가 켜지면 무엇을 실행할지 정의

비유하면:

집이 완성된 뒤, 문을 열면 자동으로 켜지는 장치

 

2. CMD vs ENTRYPOINT: 왜 둘이 나뉘어 있을까?

둘 다 “컨테이너 시작 시 실행”이라는 점은 같다.

 

하지만 차이는 덮어쓰기 가능 여부다.

 

 1) CMD: 기본 실행값

CMD ["echo", "Welcome to Codeit."]

컨테이너 실행 시:

docker run myimage

→ echo Welcome to Codeit. 실행

 

하지만 이렇게 하면:

docker run myimage echo "Hello"

→ 기존 CMD는 무시되고 echo Hello 실행

 

즉,

CMD는 바꿀 수 있는 기본값

 

 2)  ENTRYPOINT: 고정 실행 프로그램

ENTRYPOINT ["npm", "run", "start"]

이 이미지는 무조건 npm run start가 실행된다.

실행 시 다른 명령을 줘도 완전히 대체되지 않는다.

 

즉,

ENTRYPOINT는 이 컨테이너의 정체성

 

3. CMD와 ENTRYPOINT를 같이 쓰면?

여기서 중요한 포인트가 나온다.

FROM ubuntu
ENTRYPOINT ["echo", "Welcome To"]
CMD ["Codeit"]

컨테이너 실행 결과:

echo Welcome To Codeit

즉,

CMD는 ENTRYPOINT의 파라미터가 된다.

 

 1) 실행 시 CMD를 바꾸면?

docker run myimage Seoul

→ echo Welcome To Seoul

 

docker run myimage Busan

→ echo Welcome To Busan

 

이 경우 CMD는

실행 시점에 바뀔 수 있는 인자

역할을 한다.

 

2) 실제 동작을 구조로 보면

ENTRYPOINT ["echo", "Welcome To"]
CMD ["Codeit"]

Docker가 내부적으로 합치는 방식은:

ENTRYPOINT + CMD

즉,

["echo", "Welcome To"] + ["Codeit"]
=
["echo", "Welcome To", "Codeit"]

그래서 실행 결과가:

echo Welcome To Codeit

 

 3)  왜 “파라미터”라고 부를까?

 

리눅스에서 명령어 구조는 보통 이렇습니다:

프로그램(명령어)  인자1  인자2

예:

echo Hello World

여기서:

  • echo → 실행 프로그램(명령어)
  • Hello, World → 파라미터(인자)

위 Docker 예제에서도:

echo   Welcome To   Codeit
  • ENTRYPOINT → 실행 프로그램 부분
  • CMD → 그 뒤에 붙는 인자 부분

그래서

CMD는 ENTRYPOINT의 파라미터 역할을 한다

라고 표현하는 겁니다.

 

 4)  더 명확한 예시

ENTRYPOINT ["python"]
CMD ["app.py"]

실행 결과:

python app.py

여기서:

  • python → 프로그램(명령어)
  • app.py → 파라미터

이 구조가 훨씬 직관적입니다.

 

 5) 핵심 내용

 

파라미터( ENTRYPOINT 뒤에 이어붙는 값 즉, 실행 프로그램(명령어)에 전달되는 인자(argument)를 의미합니다.)는

겉으로 보면 그냥 뒤에 붙는 것처럼 보이지만,

ENTRYPOINT는 실행 주체
CMD는 그 실행 주체에 전달되는 인자

 

그래서 “CMD는 ENTRYPOINT의 파라미터가 된다”고 표현하는 것입니다.

 

4. 역할 정리

명령어 실행 시점 덮어쓰기 역할
RUN 이미지 빌드 시 해당 없음 설치/설정 (이미지 레이어)
CMD 컨테이너 시작 시  가능 기본 실행값
ENTRYPOINT 컨테이너  시작 시 기본적으로 불가 고정 실행 프로그램  

 

5. 실무에서의 일반적인 패턴

  • RUN → shell 형식 많이 사용
  • ENTRYPOINT → exec 형식 권장
  • CMD → ENTRYPOINT의 기본 인자 역할로 사용 ( exec 형식 권장)

이렇게 쓰면 예측 가능하고 명확하다.

 

RUN은 빌드 시 실행되고, CMD는 바꿀 수 있는 기본 실행값이며, ENTRYPOINT는 컨테이너의 고정 실행 프로그램이다.