CMD vs ENTRYPOINT

2025. 12. 30. 20:12Docker

도커파일에서 CMDENTRYPOINT의 차이는 “컨테이너에서 무엇을 실행할 것인가”“그 실행을 사용자가 얼마나 바꿀 수 있는가”에 있습니다.

 

1️⃣ 한 줄 요약

구분 역할 docker run 아규먼트 영향
CMD 디폴트 실행 커맨드(또는 디폴트 아규먼트) 완전히 덮어씀
ENTRYPOINT 컨테이너의 고정 실행 파일 아규먼트는 뒤에 추가됨

 

👉 CMD = 디폴트 값, ENTRYPOINT = 고정된 실행 진입점

 

2️⃣ CMD란?

📌 개념

  • 컨테이너 실행 시 디폴트로 실행할 커맨드
  • docker run에 커맨드를 주면 CMD는 무시됨

📌 예제

FROM ubuntu
CMD ["echo", "Hello Docker"]
docker run myimage
# 👉 Hello Docker

docker run myimage echo "Hi"
# 👉 Hi   (CMD 완전히 대체됨)

📌 특징 요약

  • 디폴트 실행 명령
  • 실행 시 사용자 명령이 CMD를 대체
  • 이미지 제작자보다 사용자 제어권이 큼
FROM ubuntu
CMD ["echo", "hello"]
docker run myimage touch hello.txt

📌 결과

  • CMD ["echo", "hello"]는 완전히 무시
  • 실제 실행 명령은 다음과 동일
touch hello.txt

📌 즉, CMD는 docker run 명령으로 언제든지 변경(덮어쓰기) 가능합니다.

 

3️⃣ ENTRYPOINT란?

📌 개념

  • 컨테이너의 실행 진입점
  • 항상 실행되는 고정 프로그램
  • docker run 인자는 ENTRYPOINT 뒤에 붙음

📌 예제

FROM ubuntu
ENTRYPOINT ["echo"]
docker run myimage Hello
# 👉 Hello

 

echo는 고정, "Hello"는 아규먼트로 전달

 

 

4️⃣ ENTRYPOINT + CMD 함께 쓰기 (⭐ 실무 핵심)

 

👉 ENTRYPOINT = 실행 파일
👉 CMD = 디폴트 아규먼트

 

📌 예제

FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello Docker"]
docker run myimage
# 👉 Hello Docker

docker run myimage Hi
# 👉 Hi

📌 해석

  • ENTRYPOINT: echo (절대 안 바뀜)
  • CMD: 기본 인자 (Hello Docker)
  • docker run myimage Hi → CMD만 교체됨

 

5️⃣ Exec 형식 vs Shell 형식 (중요)

✅ Exec 형식 (권장)

CMD ["java", "-jar", "app.jar"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]
  • PID 1 문제 해결
  • 시그널(SIGTERM) 정상 수신
  • 컨테이너 종료/재시작 안정적

❌ Shell 형식

CMD java -jar app.jar
  • /bin/sh -c로 감싸짐
  • 시그널 전달 문제 발생 가능

 

👉 운영 환경에서는 반드시 Exec 형식 사용하시는 것이 좋습니다.

 

 

6️⃣ 언제 CMD를 쓰고, 언제 ENTRYPOINT를 쓰나?

✅ CMD가 적합한 경우

  • 범용 이미지 (ubuntu, node 등)
  • 실행 명령을 사용자가 자주 바꿔야 할 때
CMD ["bash"]

✅ ENTRYPOINT가 적합한 경우

  • 이미지 = 특정 프로그램
  • CLI 도구, 서버 프로세스
ENTRYPOINT ["java", "-jar", "app.jar"]

⭐ 가장 많이 쓰는 패턴 (Spring Boot 포함)

ENTRYPOINT ["java", "-jar", "/app/app.jar"]
CMD ["--spring.profiles.active=prod"]
docker run myapp --spring.profiles.active=dev

 

7️⃣ 자주 나오는 면접/실무 질문 포인트

❓ CMD가 여러 개면?

👉 마지막 CMD만 유효

❓ ENTRYPOINT를 바꾸고 싶으면?

docker run --entrypoint bash myimage

❓ 왜 ENTRYPOINT만 쓰면 불편한가?

  • 옵션 변경이 어려움
  • 그래서 ENTRYPOINT + CMD 조합이 가장 이상적

8️⃣ 정리 한 장 요약

ENTRYPOINT = 실행할 프로그램 (고정)
CMD        = 기본 인자 또는 기본 명령 (가변)

docker run 인자
- CMD        → 덮어씀
- ENTRYPOINT → 뒤에 붙음

'Docker' 카테고리의 다른 글

COPY --from=build  (0) 2025.12.30
Multi-Stage Build  (0) 2025.12.30
Docker Hub에서 Docker Image 삭제 방법  (0) 2024.12.06
Docker 커맨드와 컨셉 이해  (0) 2024.12.06
Windows 11에서 도커 로컬 리포지토리의 기본 위치  (0) 2024.12.03