CMD vs ENTRYPOINT
2025. 12. 30. 20:12ㆍDocker
도커파일에서 CMD와 ENTRYPOINT의 차이는 “컨테이너에서 무엇을 실행할 것인가”와 “그 실행을 사용자가 얼마나 바꿀 수 있는가”에 있습니다.
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 |