반응형
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 설정 및 실행 예시
- 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" 이 실행됨
- 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" 이 실행됨
반응형
'IT > Kubernetes' 카테고리의 다른 글
[CKA독학]필수 시험 초기 설정 + 잡기술 (0) | 2021.06.11 |
---|---|
[CKA독학]configmap/secret 사용법 (0) | 2021.06.11 |
[CKA독학]kubernetes Cluster Maintenance 정리(drain/cordon/uncordon/ectd 백업&복구) (0) | 2021.06.04 |
[CKA독학]kubernetes Static pod/multi scheduler 정리 (0) | 2021.06.03 |
[CKA독학]kubernetes Resource Requests/Limits요약 정리 (0) | 2021.06.03 |