공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/kubernetes

헷갈리니까 확실히 알고 쓰자! Docker의 Entrypoint, cmd와 k8s의 command, args 비교하기

inspirit941 2022. 3. 5. 15:24
반응형

Command Argument.

Configuring Application은 아래 세 가지 의미를 포함한다.

  • Configuring Command / Argument on Application
  • Configuring Env variable
  • Configuring secret

시험에서의 공식 범위는 아니지만, 과소평가해서는 안 되는 영억. docker 커멘드가 k8s에는 어떻게 대응할 수 있는지 확인하기 위함.



스크린샷 2022-03-05 오후 12 26 14

  • docker run ubuntu를 실행하면, 컨테이너는 실행을 완료하고 종료한다.
  • 종료된 컨테이너까지 확인하려면 docker ps -a 명령어를 써야 한다. 이미 exit한 컨테이너를 확인할 수 있다.

VM과 달리 Container는 OS 호스팅을 하지 않는다. 프로세스 가상화 개념이므로, 프로세스가 끝나는 순간 컨테이너도 종료되어야 한다.

그럼, 어떤 프로세스가 컨테이너에서 실행되는지는 누가 결정하지?




스크린샷 2022-03-05 오후 2 45 19

  • nginx나 mysql 이미지의 명령어를 확인해보면, 이미지 맨 마지막 CMD에서 [nginx] / [mysqld] 와 같이 프로그램을 실행하는 명령어가 들어 있다.



스크린샷 2022-03-05 오후 2 45 32

  • ubunut의 경우 cmd에 bash가 들어가 있다. bash는 위의 명령어와 달리 사용자에게서 input을 받는 프로세스.
  • 우분투 이미지를 docker run으로 실행하면, 내부적으로는 bash 터미널이 생성되어 명령어를 기다리는 상태가 된다. 하지만 docker는 별다른 명령어가 없다면 생성하고 실행한 프로세스에 더 이상 접근하지 않으므로, bash는 명령어를 입력할 터미널을 찾지 못한다. 그러므로 프로세스를 종료함.

도커 이미지에 기본적으로 세팅된 명령어를 override하는 방법

  • docker run <image-name> [run-command] 입력하기. ex) docker run ubuntu sleep 5



스크린샷 2022-03-05 오후 2 53 16

  • 만약 매번 프로그램이 실행될 때마다 같은 명령어를 override하고 싶다면 - 새로운 Dockerfile을 생성하는 경우가 일반적이다.



스크린샷 2022-03-05 오후 2 55 56

 

여기서 더, 만약 sleep 뒤에 입력하는 숫자값을 하드코딩하는 대신 파라미터로 받아서 매번 변경하고 싶다면?

  • docker run ubuntu-sleeper sleep 10 형태로 직접 입력하기. 명령어까지 직접 입력하면 되지만, 애초에 sleep 명령어를 추가한 이미지까지 새로 만들었는데 굳이 이렇게?
  • 도커 이미지에 cmd 대신 Entrypoint 를 사용한다. entrypoint는 명령어만 넣고, 파라미터는 사용자가 실행할 때 추가할 수 있도록 되어 있다.



스크린샷 2022-03-05 오후 2 57 51

 

  • entrypoint만 있을 경우, 사용자가 별다른 입력값을 넣지 않고 시작할 경우 에러를 반환할 수 있다. 디폴트 값이 설정되어 있지 않기 때문 (sleep의 경우 'missing operand' 에러가 뜬다)
  • 따라서 이런 에러를 막기 위해 Entrypoint + CMD 형태의 이미지를 사용한다. 옵션이 있으면 옵션을 우선하되, 기본값을 설정하는 식.
    • 두 가지를 함께 사용할 경우, 반드시 json format (대괄호 + 문자열 + 띄어쓰기)을 만족해야 한다.

Entrypoint 자체를 override하고 싶다면 docker run 명령어에서 --entrypoint sleep2.0 형태로 사용할 수 있다. entrypoint 명령어를 덮어쓰는 것.

Command and Argument in K8s

스크린샷 2022-03-05 오후 3 10 39

kubernetes의 yaml 파일에서

  • args : docker 이미지의 파라미터 (cmd) 를 변경하고 싶을 경우. 반드시 문자열 리스트 형태로 입력해야 한다.
  • command : docker 이미지의 entrypoint를 변경하고 싶을 경우 사용.

스크린샷 2022-03-05 오후 3 12 44

반응형