ENTRYPOINT vs CMD

ENTRYPOINT vs CMD

DockerfileENTRYPOINTCMD는 컨테이너가 시작할 때 실행할 명령어를 정의하는데 사용하는 두 가지 지시어

ENTRYPOINT vs CMD

항목ENTRYPOINTCMD
역할기본 실행 명령어 지정기본 인자 지정
우선순위항상 실행됨docker run 시 인자로 덮어쓸 수 있음
목적이 이미지가 실행될 때 항상 수행할 고정된 명령어사용자나 실행 환경이 바꾸고 싶은 유연한 값
형태exec 형식 (["executable", "param1"]) 또는 shell 형식 ("some command")exec 또는 shell 형식
함께 사용보통 ENTRYPOINT + CMD 조합으로 사용단독 사용도 가능

예제 1: CMD만 사용하는 경우

FROM ubuntu
CMD ["echo", "Hello World"]
docker run my-image
# 출력: Hello World

docker run my-image echo Bye
# 출력: Bye ← CMD는 덮어쓰기됨

예제 2: ENTRYPOINT만 사용하는 경우

FROM ubuntu
ENTRYPOINT ["echo", "Hello"]
docker run my-image
# 출력: Hello

docker run my-image World
# 출력: Hello World ← ENTRYPOINT는 고정, 인자만 추가됨

예제 3: ENTRYPOINT + CMD 조합

FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello World"]
docker run my-image
# 출력: Hello World

docker run my-image Bye
# 출력: Bye ← CMD가 덮어씌워짐, ENTRYPOINT는 그대로

Kubernetes에서의 관계

Kubernetes의 commandargs는 Docker의 ENTRYPOINTCMD를 오버라이드할 수 있음:

Dockerfile 지시어Kubernetes 필드
ENTRYPOINTcommand
CMDargs

예를 들어:

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

이런 Dockerfile을 기반으로 만든 이미지를 Kubernetes에서 이렇게 쓴다면:

command: ["python3"]
args: ["server.py"]

→ 컨테이너는 python3 server.py를 실행


요약

  • ENTRYPOINT: 항상 실행할 명령어 (덮어쓰기 어려움)
  • CMD: 기본 인자 (필요하면 덮어쓰기 가능)
  • Kubernetes에서는 command → ENTRYPOINT, args → CMD 오버라이드