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는 컨테이너의 고정 실행 프로그램이다.
'컨테이너·워크플로우 자동화 > DocKer 기본 및 활용' 카테고리의 다른 글
| Docker 이미지 최적화(레이어 캐시와 도미노 무효화 구조 이해) (1) | 2026.02.18 |
|---|---|
| Dockerfile ENV vs ARG: 변수의 실행 시점과 생명주기 차이 (0) | 2026.02.18 |
| Dockerfile Shell 형식과 Exec 형식의 개념 (0) | 2026.02.18 |
| Docker Compose depends_on의 동작 원리와 한계 (0) | 2026.02.18 |
| Docker Compose 구성 이해하기 (0) | 2026.02.18 |