개요
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는 command와 argument를 한 번에 정의할 수 있습니다.
ENTRYPOINT는 command만 정의할 수 있습니다.
Pod Yaml에서 command와 argument 전달 방법
argument 전달
먼저 아래의 Dockerfile을 가지고 ubuntu-sleeper이라는 image를 만들었습니다.
#docker build -t ubuntu-sleeper.
자 그럼 이제 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
'Cloud > k8s-CKA' 카테고리의 다른 글
[CKA] 19. multi container pods (0) | 2023.04.20 |
---|---|
[CKA] 18. Environment Variables (0) | 2023.03.28 |
[CKA] 16. k8s Rolling update and Rollback (2) | 2023.03.23 |
[CKA] 15. k8s Monitoring (METRIC SERVER) and log (0) | 2023.03.19 |
[CKA] 14. scheduler profile 설정 (0) | 2023.03.07 |