Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

Dockerfile CMD vs ENDPOINT

Dockerfile CMD vs ENDPOINT

Dockerfile에서 CMD와 ENDPOINT의 차이를 알아본다.

기본적인 Docker 빌드/시작 코드

1
2
$ docker build -t dockername .
$ docker run --name continaer_name dockername

*이미지가 꺠지는게 존재하지만 누르면 잘보입니다.

CMD

  • cmd를 실행시키는 방식
  • 기본 echo test를 설정한다.
1
2
FROM ubuntu
CMD ["echo", "test" ]

2023-11-10-1-51-18

하나의 문자열로 실행시키면 어떻게 될까?

  • 하나의 문자열로는 불가능하다.
1
2
FROM ubuntu
CMD ["echo test" ]

2023-11-10-1-51-52

변수를 지정

  • ENV를 사용하여 dockerfile을 빌드한다.
1
2
3
FROM ubuntu
ENV VAR1=test_value
CMD echo $VAR1

2023-11-10-2-04-07

  • 여러 변수를 지정하여 dockerfile을 빌드한다
1
2
3
4
FROM ubuntu
ENV VAR1=test_value\
    VAR2=var2
CMD echo $VAR1 $VAR2

2023-11-10-2-18-10

1
$ docker inspect containerid

inspect-test3

옵션을 주어서 실행하게 된다면, 요청 받은 인자값으로 대체

1
2
$ docker run --name containername buildname ps -aef
$ docker inspect containername

inspect-test4

Entrypoint

  • ENTRYPOINT도 CMD와 코드 구성은 동일하다.
  • 결국 CMD와는 다르게 커맨드에 추가 시 없어진는게 아니라 추가로 동작한다. → 동작원리만 다르다.
1
2
3
4
5
# Entrypoint
FROM ubuntu
ENV VAR1=test_value\
    VAR2=var2
ENTRYPOINT echo $VAR1 $VAR2/
1
2
3
$ docker build -t buildname -f filename .
$ docker run --name containername buildname
$ docker inspect containername

entry<br/

  • docker 실행시 옵션을 주면 어떻게 될까?
  • 커맨드가 추가되는것을 볼 수 있다.
1
2
$ docker run --name containername buildname ps -aef
$ docker inspect containername

entry-command

어떤 상황에서 동적으로 둘다 쓸까?

  • batch script를 적용해본다.
  • 주기적으로 프로세스를 확인하는 batch 작업
  • default = 5
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

INTERVAL=$1

if [ -z "$INTERVAL" ]; then
  INTERVAL=5
fi

while true;
do
  ps x;
  sleep $INTERVAL;
done
1
2
3
4
5
FROM ubuntu

Add batch_ps.sh /usr/local/bin/batch_ps.sh
RUN chmod +x /usr/local/bin/batch_ps.sh
ENTRYPOINT /usr/local/bin/batch_ps.sh
1
2
$ docker build -t batch_job -f Batchps .
$ docker run --name batch_test batch_job

ENTRYPOINT와 CMD를 사용하여 동적으로 만들기

  • 코드도 명확해지고 동적으로 할당이 가능하다.
1
2
3
4
5
6
FROM ubuntu

Add batch_ps.sh /usr/local/bin/batch_ps.sh
RUN chmod +x /usr/local/bin/batch_ps.sh
ENTRYPOINT ["/usr/local/bin/batch_ps.sh"]
CMD ["5"]
1
2
3
4
5
6
7
8
9
#!/bin/bash

INTERVAL=$1

while true;
do
  ps x;
  sleep $INTERVAL;
done

batch