Post

Dockerfile vs. Kubernetes

Dockerfile vs. Kubernetes command / args (핵심 비교)


지시어 / 필드주체역할우선순위기억 핵심
ENTRYPOINTDockerfile컨테이너의 실행 파일/주 프로그램K8s command가 없으면 적용이미지의 “정체성” (항상 실행)
CMDDockerfileENTRYPOINT기본 인수 또는 기본 명령K8s args가 없으면 적용“정체성”의 “기본 설정” (바뀔 수 있음)
commandKubernetes PodENTRYPOINT재정의최우선 (Dockerfile ENTRYPOINT를 덮어씀)K8s가 지정하는 “새 정체성”
argsKubernetes PodCMD재정의최우선 (Dockerfile CMD를 덮어씀)K8s가 지정하는 “새 설정”

undefined

핵심 요약: 쉽게 기억하는 방법

ENTRYPOINT는 컨테이너의 “진입점” 또는 “실행 파일” 역할을 하고, CMD ENTRYPOINT에 전달되는 “인수” 또는 “기본 명령어” 역할을 한다고 생각하면 됩니다.

Kubernetes command / args (핵심 요약: 쉽게 기억하는 방법)

command는 컨테이너의 “최종 실행 파일” 역할을 하고, args command에 전달되는 “최종 인수” 역할을 합니다. 이 둘은 Dockerfile의 설정을 덮어씁니다.

Dockerfile과 k8s pod spec 조합 문제 다음 두 조건하에서 k8s pod 생성시 실제 명령어는? ```docker FROM python:3.6-alpine RUN pip install flask COPY . /opt/ EXPOSE 8080 WORKDIR /opt ENTRYPOINT ["python", "app.py"] CMD ["--color", "red"] ``` ```yaml apiVersion: v1 kind: Pod metadata: name: webapp-green labels: name: webapp-green spec: containers: - name: simple-webapp image: kodekloud/webapp-color command: ["--color","green"] ```
`--color green`

Dockerfile ENTRYPOINT / CMD 작성 방식 (Shell vs. Exec Form)

Dockerfile의 ENTRYPOINTCMD는 두 가지 방식으로 작성할 수 있으며, 이 방식은 컨테이너 내부에서 명령어가 실행되는 방식에 중요한 차이를 만듭니다.

1. exec form (실행 폼): 권장 방식!

  • 작성 방식: ["executable", "param1", "param2"] undefined- 실행 방식: 셸(/bin/sh 등)을 거치지 않고 프로그램을 컨테이너의 PID 1으로 직접 실행합니다.
  • 핵심 이점: undefined- 주의: 셸의 특수 기능(환경 변수 자동 확장, 파이프 |, 리다이렉션 > 등)은 직접 사용할 수 없습니다. (필요하면 ["/bin/sh", "-c", "your command here"] 형태로 명시적으로 셸을 호출해야 함.)
  • 기억: ["직접", "실행", "하라"] (PID 1, 우아한 종료)

2. shell form (셸 폼)

  • 작성 방식: executable param1 param2 undefined- 실행 방식: Docker가 이 명령어를 /bin/sh -c "명령어" 형태로 셸을 통해 실행합니다.
  • 핵심 이점: undefined- 주의: undefined- 기억: "셸을 거쳐서 실행!" (PID 1 문제, 간단한 스크립트용)

Best Practice (최고의 관행)

  • Dockerfile에서는 ENTRYPOINT CMD 모두 exec form을 사용하는 것을 강력히 권장합니다.Dockerfile undefinedundefined- Kubernetes Pod 정의에서는 command args 필드를 가급적 사용하지 않는 것이 좋습니다.YAML undefined
This post is licensed under CC BY 4.0 by the author.