다음 도서를 참고하여 작성하였습니다.
www.aladin.co.kr/shop/wproduct.aspx?ItemId=166082298
Dockerfile에서 RUN 명령은 이미지를 작성하기 위해 실행하는 명령을 기술하지만,
이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD 명령을 사용합니다.
또한 Dockerfile에는 하나의 CMD 명령을 기술할 수 있습니다. 만일 여러 개를 지정하면 마지막 명령만 유효합니다.
예를 들어 웹 서버를 가동시키기 위해 Nginx를 설치하는 명령은 RUN 명령을, 설치한 Nginx를 데몬으로서 컨테이너 안에서 상시 작동시키기 위해서는 CMD 명령을 사용합니다.
CMD 명령은 다음 세가지 기술 방법이 있습니다.
1. Exec 형식으로 기술
RUN 명령의 구문과 같은 형식입니다. 쉘을 호출하지 않고 직접 실행하며, 인수는 JSON 배열로 지정합니다.
Ubuntu에서 Nginx를 포어그라운드에서 실행할 경우 다음과 같이 기술합니다.
#Dockerfile
#베이스 이미지 설정
FROM ubuntu:16.04
# Nginx 설치
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx
# 포트 지정
EXPOSE 80
# 서버 실행
CMD ["nginx", "-g", "daemon off;"]
2. Shell 형식으로 기술
RUN 명령의 구문과 같은 형식입니다. 운영체제의 쉘(/bin/sh)을 통하여 명령어를 실행할 때 사용합니다.
Ubuntu에서 Nginx를 포어그라운드에서 실행할 경우 다음과 같이 기술합니다.
#Dockerfile
#베이스 이미지 설정
FROM ubuntu:16.04
# Nginx 설치
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx
# 포트 지정
EXPOSE 80
# 서버 실행
CMD nginx -g 'daemon off;'
3. ENTRYPOINT 명령의 파라미터로 기술
ENTRYPOINT 명령의 인수로 CMD 명령을 사용할 수 있습니다. ENTRYPOINT 명령에서 지정한 명령은 Dockerfile에서 빌드한 이미지로부터 Docker 컨테이너를 시작하기 때문에 docker container run 명령을 실행했을 때 실행됩니다.
ENTRYPOINT 명령 또한 Exec 형식 또는 Shell 형식으로 기술합니다.
ENTRYPOINT ["nginx", "-g", "daemon off;"]
ENTRYPOINT nginx -g 'daemon off;'
ENTRYPOINT 명령과 CMD 명령의 차이는 docker container run 명령 실행 시의 동작에 있습니다.
CMD의 경우 컨테이너 시작 시에 실행하고 싶은 명령을 정의해도 docker container run 명령 실행 시에 인수로 새로운 명령을 지정한 경우 이것을 우선 실행합니다. 반면 ENTRYPOINT에서 지정한 명령은 반드시 컨테이너에서 실행되는데, 실행 시에 명령 인수를 지정하고 싶을 때는 CMD 명령과 조합하여 사용합니다.
따라서, ENTRYPOINT 명령으로는 실행하고 싶은 명령 자체를 지정하고, CMD 명령으로는 그 명령의 인수를 지정하면, 컨테이너를 실행했을 때 기본 작동을 결정할 수 있습니다.
다음은 ENTRYPOINT와 CMD를 조합한 예시입니다.
# 베이스 이미지 설정
FROM ubuntu:16.04
# top 실행
ENTRYPOINT ["top"]
CMD ["-d", "10"]
ubuntu에서 top 명령어를 10초 마다 갱신하는 이미지 입니다. 위의 이미지를 빌드합니다.
docker build -t sample-top .
위의 이미지를 CMD 명령에서 지정한 10초 간격으로 갱신하는 경우 인수 없이 컨테이너를 실행합니다.
docker container run -it sample-top
만약 2초 간격으로 top를 갱신하기를 원한다면 다음과 같이 컨테이너를 실행합니다.
docker container run -it sample -d 2
CMD 명령은 docker container run 명령 실행 시에 덮어 쓸 수 있다는 구조 때문에 가능합니다.
위와 같은 경우에 ENTRYPOINT와 CMD 명령어를 조합하여 사용할 수 있습니다.
Dockerfile의 CMD에 대하여 알아보았습니다.
'About > Docker' 카테고리의 다른 글
[Docker] Dockerfile ONBUILD 명령 (0) | 2021.05.06 |
---|---|
[Docker] Dockerfile과 이미지 레이어에 대하여 (0) | 2021.05.06 |
[Docker] Dockerfile RUN 사용방법 (0) | 2021.05.06 |
[Docker] Multi-stage build를 이용한 Nginx 웹 서버 이미지 만들기 (0) | 2021.05.03 |
[Docker] Dockerfile - Multi-stage build(멀티스테이지 빌드) (0) | 2021.05.03 |