본문으로 바로가기
반응형

intro

  • dockerfile에 CMD와 ENTRYPOINT옵션을 사용하면 docker이미지를 실행할때 사용자가 입력한 특정 명령어를 실행할 수 있습니다.
  • 또한 kubernetes에서도 docker 이미지를 사용하여 pod를 생성할때 commnad와 args 필드 설정을 통해서 컨테이너를 실행할때 특정 명령어를 실행할 수 있습니다.
  • 오늘은 dockerfile에 COMMAND와 ENTRYPOINT는 무엇이고 어떻게 사용하는지에 대해 알아보도록 하겠습니다.
  • 그리고 더나아가 kubernetes의 command와 args와는 어떻게 다른지에 대해 알아 보도록 하겠습니다.

dockerfile의 CMD란?

  • 컨테이너가 실행될때 특정 명령어를 실핼할 수 있도록 해주는 기능
  • CMD옵션은 배열로 구분됨, 띄어 쓰기 또는 대괄호안에서 json배열 형태로 구분함

CMD 예시1

  • dockerfile
FROM ubuntu
CMD sleep 5
  • docker 실행
docker build -t sleep_test .
docker run sleep_test

CMD 예시2

  • dockerfile
FROM ubuntu
CMD ["sleep","5"]
  • docker 실행
docker build -t sleep_test .
docker run sleep_test

dockerfile 수정없이 파라미터를 변경하고 싶다면?

  • 좋은 예
FROM Ubuntu
CMD ["sleep","5"]
  • 안 좋은 예
FROM Ubuntu
CMD ["sleep 5"]
  • 파라미터 변경하여 docker 실행
docker build -t sleep_test .
docker run sleep_test 10
## CMD ["sleep","10"] 으로 구현한것과 동일하게 실행됨

dockerfile의 ENTRYPOINT 란?

  • CMD와 동일하지만 명령어가 반드시 실행된다는 차이점이 있음
  • CMD옵션과 동일하게 배열로 구분됨, 띄어 쓰기 또는 대괄호안에서 json배열 형태로 구분함

ENTRYPOINT 예시

  • dockerfile
FROM ubuntu
ENTRYPOINT ["sleep"]
  • docker 실행
docker build -t sleep_test .
docker run sleep_test 10
# sleep for 10 seconds and exit
docker run sleep_test
# sleep을 얼마나 줄지 파라미터 값이 없으므로 error 

dockerfile의 ENTRYPOINT 와 CMD차이

  • CMD는 docker를 실행할때 파라미터를 변경하여 실행이 가능함
  • ENTRYPOINT는 docker를 실행할때 파라미터를 변경 할 수 없음

ENTRYPOINT는 컨테이너 실행시 무조건 실행됨

  • dockerfile
FROM ubuntu
ENTRYPOINT ["sleep","5"]
  • docker 실행
docker build -t sleep_test .
docker run sleep_test 10
# sleep for 15 seconds and exit

CMD와 ENTRYPOINT를 혼합하여 사용

  • ENTRRYPOINT는 실행할때 무조건 실행되고, CMD는 파라미터를 변경할 수 있으므로 이를 혼합하여 사용할 수 있음

CMD와 ENTRYPOINT 혼합 사용 예시

  • dockerfile
FROM ubuntu
ENTRYPOINT ["sleep"]
CMD ["10"]
  • docker 실행
docker build -t sleep_test .
docker run sleep_test 
# sleep for 10 seconds and exit
docker run sleep_test 20
# sleep for 20 seconds and exit

Dockerfile의 ENTRYPOINT/CMD와 k8s command/agrs 의 관계

  • ENTRRYPOINT = command
  • CMD = args

kubernetes의 commands / arguments yaml설정 예시

  • 예시1
apiVersion: v1
kind: pod 
#### ----------------------
metadata:
  name: sleep-test
spec:
  containers:
  - name: sleep-test-container
    image: sleep_test
    command: [ "sleeps", "50000" ]
#### -----------------------
  • 예시2
apiVersion: v1
kind: pod 
#### ----------------------
metadata:
  name: sleep-test
spec:
  containers:
  - name: sleep-test-container
    image: sleep_test
    command:       #commands 아님
      - "sleep"
      - "50000"    #쌍따옴표 꼭 넣어줘야함
#### -----------------------
  • 예시3
apiVersion: v1
kind: pod 
#### ----------------------
metadata:
  name: sleep-test
spec:
  containers:
  - name: sleep-test-container
    image: sleep_test
    command:       #commands 아님
      - "sleep"
    args:
      - "50000"    #쌍따옴표 꼭 넣어줘야함
#### -----------------------

k8s commands arguments 설정 및 실행 예시

  1. Case1 : Dockerfile ENTRYPOINT 보다 k8s command가 우선시 됨
  • Dockerfile
FROM ubuntu
ENTRYPOINT [sleep]
CMD ["5"]
  • docker 빌드
docker build -t sleep_test .
  • 위 도커파일로 생성한 이미지 사용
apiVersion: v1
kind: pod 
#### ----------------------
metadata:
  name: sleep-test
spec:
  containers:
  - name: sleep-test-container
    image: sleep_test
    command:       #commands 아님
      - "5000"
#### -----------------------

이 경우 Dockerfile ENTRYPOINT 보다 k8s command가 우선시 되므로 pod의 컨테이너가 실행될때 "5000" 이 실행됨

  1. Case2 : Dockerfile CMD 보다 k8s args가 우선시 됨
  • Dockerfile
FROM ubuntu
ENTRYPOINT [sleep]
CMD ["5"]
  • docker 빌드
docker build -t sleep_test .
  • 위 도커파일로 생성한 이미지 사용
apiVersion: v1
kind: pod 
#### ----------------------
metadata:
  name: sleep-test
spec:
  containers:
  - name: sleep-test-container
    image: sleep_test
    command:       #commands 아님
      - "sleep"
    args:
      - "5000"
#### -----------------------

이 경우 pod의 컨테이너가 실행될때 Dockerfile CMD 보다 k8s args가 우선시 되므로 "sleep 5000" 이 실행됨

반응형