티스토리 뷰
도커 이미지를 빌드할때 명령어를 기입하는 용도로 3가지의 표현이 존재한다. 이 차이가 뭔지 알고 넘어가도록 하자.
이 이해를 해야 docker run 을 통해 이미지를 활용할때 응용해서 실행 구성하는게 쉬워진다. 참고로 ENTRYPOINT 와 CMD 는 실행시점에 사용자가 변경가능한것도 특징중에 하나이다.
구분 | RUN | ENTRYPOINT | CMD |
명령어 사용시점 | 빌드시점 | 이미지 실행시점 | 실행시점 |
Dockerfile 기입횟수 | 여러라인에 표현가능 | 1번만 가능 | 1번만 가능 |
명령어 표현 | 명령어 그대로 타이밍 python sample.py |
배열형태로 표현 ["python"] |
배열형태로 표현 ["sample.py"] |
특징 | 빌드시에 실행됨 | ENTRYPOINT + CMD 를 조합할 경우 CMD 는 ENTRYPOINT 의 인자값이 됨 |
1. RUN
RUN 명령어는 이미지를 만들기 위해 필요한 명령어를 의미한다. 보통 필요한 모듈을 설치하거나, 압축을 풀거나 필요한 폴더를 생성해두거나 하는 명령들이 나열된다. 즉, 이미지를 만들때 필요한 구성을 만들기위해 사용하는 명령어 집합이라고 보면 편하다.
어떻게 보면 이미지를 build 하는 시점에 의미있는 명령어 집합이라고 봐도 될것 같다.
ENTRYPOINT 나 CMD 와 다른건, 여러줄에 반복해서 작성이 가능하고, 실행할 명령어를 그대로 타이핑하면 된다.
...
# 필요한 모듈 설치
RUN yum install -y wget
RUN yum install -y krb5-workstation krb5-libs krb5-auth-dialog
RUN mkdir -p /deployments
# 필요한 파일 다운로드 및 압축해제 등등 나열가능
RUN wget https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz -O /deployments/hive.tar.gz --no-check-certificate --quiet
RUN wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz -O /deployments/hadoop.tar.gz --no-check-certificate --quiet
RUN tar xzf /deployments/hive.tar.gz -C /client/hive --strip-components=1
RUN tar xzf /deployments/hadoop.tar.gz -C /client/hadoop --strip-components=1
....
2. ENTRYPOINT
ENTRYPOINT 는 CMD 와 비슷해서 헛갈릴 수 있는데, 컨테이너를 띄울 때 항상 실행되어야 할 커맨드를 표현한다.
특이한건, 1개만 선언가능하고, ENTRYPOINT 에서는 명령어를 배열형태로 표현해야 한다. (RUN 에서는 기냥 나열했는데)
...
# Django 서버 실행 하기 (python manage.py runserver 를 배열형태로 기술해야하는게 다르다)
ENTRYPOINT ["python" "manage.py", "runserver"]
...
참고로, ENTRYPOINT 를 위와 정의해서 빌드했더라도, 실행시점에 --entrypoint 옵션을 통해 실행시점에 딴 명령어로 바꾸는것도(overwrite) 가능하다. 일반적으로는 ENTRYPOINT 는 컨테이너의 동작에 중요한 의미를 갖기 때문에, 보통 이미지 생성시점의 디폴트값을 그대로 쓰고, 사용자는 CMD 값만 바꿔서 실행하게 하는게 일반적인데, 좀더 이해하고 싶다면 아래 글을 읽어보자.
2023.02.16 - [docker & kube] - [Docker] ENTRYPOINT 재정의 사용예시 - ENTRYPINT + CMD 활용
3. CMD
CMD 명령어는 해당 이미지를 컨테이너로 띄울 때 디폴트로 실행할 커맨드로 사용한다.
이 설명을 듣고나면... 그럼 ENTRYPOINT 나 CMD 둘의 차이는 도대체 뭐야? 싶을텐데...
아래와 같이, ENTRYPOINT 와 CMD 가 같이 선언되면 ENTRYPOINT 의 파라미터로 사용되는 특징이 있다.
ENTRYPOINT 의 인자로 CMD 를 사용하게 되면서, 실행시점의 동작을 커스텀하게 하는게 쉬워진다.
...
ENTRYPOINT ["python"]
CMD ["helloworld.py"]
예를 들어, 실행시점에 맨뒤의 값은 CMD 로 활용되는데 (생략시 Dockerbuild 의 CMD 값 사용)
동일한 "/etc/hosts" 를 제공해도, --entrypoint 동작을 어떻게 구성했느냐의 차이에 따라 다른 동작 구성이 가능하다.
- 단순히 메시지를 출력하는건지 (echo)
- 해당 경로의 파일내용을 보여주는건지 (cat)
## 1) entrypoint 가 "echo"
$ docker run --entrypoint echo centos:7 "/etc/hosts"
/etc/hosts
## 2) entrypoint 가 "cat"
$ docker run --entrypoint cat centos:7 "/etc/hosts"
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 42eed9467440
이건 entrypoint 에 쉘스크립트를 구성해서 넣어두면 더 다양한 커스텀한 실행방법구성이 가능하다는 말이다.
'docker & k8s' 카테고리의 다른 글
[Centos] Docker + private docker-Registry 설치방법 (0) | 2022.09.14 |
---|---|
[docker] no space left on device 이유와 해결 (0) | 2022.09.05 |