Cloud/k8s-CKA

[CKA] 17. command and argument

jinkwon.kim 2023. 3. 25. 01:09
728x90
반응형

개요

deployment yaml 또는 Pod yaml 파일에서 command와 argument를 어떻게 전달하는 알아보겠습니다.

사전 지식

deployment / Pod yaml 파일에서 command와 argument를 어떻게 전달하는 알아보기 전에  Dockerfile에서 command와 argument를 어떻게 전달하는지 먼저 알아보겠습니다. 이걸 먼저 알아보는 이유는 Dockerfile에서 사용하는 command와 argument 전달 방식이 deployment / pod yaml 파일에서 동일한 개념으로 사용되기 때문입니다. 

Dockerfile에서 command와 argument 전달 방법

2가의 전달 방법이 있습니다. CMD 이용과 ETNRYPOINT 이용합니다.

CMD 이용

CMD 정의

  • Docker 컨테이너에서 실행할 기본 명령을 정의합니다.
  • 컨테이너를 시작할 때마다 실행됩니다.
  • docker run 명령어에 argument를 추가하면, CMD로 지정한 기본 명령을 덮어쓸 수 있습니다.

Dockerfile에서는 command agrument로 CMD항목을 정의합니다.

  • command : 실행할 명령어 
  • argument : 명령어의 인자

아래는 ubuntu를 image는 만들기 위한 Dockerfile입니다.

아래 Dockerfile에서 CMD는 docker image가 실행되고 나서 마지막에 수행할 명령어로 sleep 5를 정의하였습니다.

CMD 명령은 2가지 형식

1. CMD command [ argument 1 | ... ]

Ex) CMD sleep  5

 

2. CMD ["command", [ "argument 1" , ... ] ]

Ex) CMD ["sleep",  "5"]

 

docker image의 command와 argument 재 정의 방법

docker run에서 아래와 같이 command와 argument를 전달하면 CMD로 지정한 기본 명령을 덮어쓸 수 있습니다.

 

docker run ubuntu command Argument1

Ex) docker run ubuntu sleep 10

ENTRYPOINT 이용

ENTRYPOINT 정의

  • ENTRYPOINT는 컨테이너를 실행할 때 항상 호출되는 실행 파일을 정의합니다.
  • ENTRYPOINT로 지정된 실행 파일은 컨테이너 실행 시 항상 호출되며, docker run 명령어에 인수를 추가하면 해당 인수가 ENTRYPOINT 실행 파일에 전달됩니다.

ENTRYPOINT에 Argument를 전달하는 방법은 2가지가 있습니다. 

 

1. docker run ubuntu Argument1

Ex) docker run ubuntu 10

 

2. ENTRYPOINT + CMD 조합

CMD 부분이 ENTRYPOINT의 Argument로 전달됩니다.

3. ENTRYPOINT args 조합

ENTRYPOINT에 agrument를 함께 전달합니다.

 

4. ENTRYPOINT 덮어쓰는 방법

--entrypoint를 사용하여 ENTRYPOINT를 재정의 합니다. 

docker run --entrypoint {new_command} {image_name} {argument}

CMD와 ENTRYPOINT의 차이점 

CMD는 commandargument를 한 번에 정의할 수 있습니다. 

ENTRYPOINT는 command만 정의할 수 있습니다. 

Pod Yaml에서 command와 argument 전달 방법

argument 전달

먼저 아래의 Dockerfile을 가지고 ubuntu-sleeper이라는  image를  만들었습니다.

#docker build -t ubuntu-sleeper.

Dockerfile

자 그럼 이제 ubuntu-sleeper image로 가지고 ENTRYPOINT에서 사용할  agrument를 넘기는 Pod yaml 파일을 만들어 보겠습니다.  아래 yaml 파일에서 agrs가 Dockerfile의 의 CMD를 덮어씁니다.

참고로 args는 array 형태이어야 합니다.

args의 array 표기 방법 1

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleeper
  labels:
    name: ubuntu-sleeper
spec:
  containers:
  - name: ubuntu-sleeper
    image: ubuntu-sleeper
    args: ["5"]

args의 array 표기 방법 2

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleeper
  labels:
    name: ubuntu-sleeper
spec:
  containers:
  - name: ubuntu-sleeper
    image: ubuntu-sleeper
    args:
    - "5"

 

 

ENTRYPOINT 및 argument 전달 

이번에는 ubuntu-sleeper image로 가지고 ETNRYPOINT와 agrument를 넘기는 Pod yaml 파일을 만들어 보겠습니다. 

아래 yaml 파일에서 command가 Dockerfile의 ENTRYPOINT를 덮어씁니다.

참고로 command와 args는 array 형태이어야 합니다.

command and args의 array 표기 방법 1

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleeper
  labels:
    name: ubuntu-sleeper
spec:
  containers:
  - name: ubuntu-sleeper
    image: ubuntu-sleeper
    command: ["sleep2.0"]
    args: ["10"]

command and args의 array 표기 방법 2

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleeper
  labels:
    name: ubuntu-sleeper
spec:
  containers:
  - name: ubuntu-sleeper
    image: ubuntu-sleeper
    command:
    - "sleep2.0"
    args: 
    - "10"

 

최종 비교

우선순위 

Dockerfile에서의 ETNRYPOINT와 CMD 정의는 Yaml 파일의 command와 args로 교체됩니다. 

알면 좋은 것

pod강제 종료 후 생성

pod생성 시 command를 args를 sleep 2000으로 설정하고 실행하게 되면 pod를 edit로 수정해서 2000을 3000으로 변경하려고 하면 변경이 안됩니다. 이유는 k8s에서 막기 때문입니다. 그래서 이때는 replace --force 명령을 이용하여 강제로 delete 하고 다시 생성하게 해야 합니다. 

pod 실행 시 command args 전달

 

정리

Pod yaml에서 command는 Dockerfile의 ENRYPOINT와 일치하고 args는 CMD와 일치합니다.

Pod yaml파일의 설정 우선순위가 가장 높다.

Next Post

[CKA] 18. Environment Variables

728x90
반응형