본문 바로가기

Computer/Docker

Dockerfile (2) - RUN, CMD, ENTRYPOINT

반응형

Dockerfile (1) - 개요


이번 포스트에서는 Dockerfile에서 만든 이미지로 컨테이너를 실행했을 때 각종 명령을 실행하는 방법에 대해 알아보려 합니다.

RUN

컨테이너에 FROM 명령에서 지정한 베이스 이미지에 대해 "애플리케이션/미들웨어를 설치한다"/"환경구축을 위한 명령을 실행한다" 등의 명령을 실행할 때 RUN 명령을 사용합니다. RUN 이후에 일반적인 쉘 스크립트 형식으로 명령을 기술할 수 있고 ['args1', 'args2',...] 형식으로 지정할 경우 쉘을 경유하지 않고 직접 실행합니다. 컨테이너 실행시의 디폴트 쉘은 ['bin/sh', '-c'] 형식으로 지정됩니다. 다음 명령어를 통해 도커 이미지를 빌드하면 명령이 한 줄씩 실행되면서 이미지를 생성하고 쉘 스크립트 형식은 /bin/sh 쉘로 실행되고 리스트 형식은 쉘을 통하지 않고 실행되는 것을 알 수 있습니다. 주의할 점은 리스트 형식을 통해 기입할 때 단 따옴표 ('')가 아닌 쌍 따옴표로 ("") argument를 기술해야 합니다.

FROM ubuntu:latest
RUN echo Hello, This is Shell type format
RUN ["echo", "This is Exex format"]

 

CMD, ENTRYPOINT

RUN 명령은 이미지를 작성하기 위해 실행하는 명령을 기술하지만, 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD 명령을 사용합니다. Dockerfile에는 하나의 CMD 명령을 기술할 수 있으며 여러 개를 지정할 때는 마지막 명령만 유효합니다. ENTRYPOINT 명령도 CMD 명령과 마찬가지로 컨테이너 안에서 명령을 실행하기 위한 dockerfile 구문입니다. CMD/ENTRYPOINT 명령 모두 RUN 명령과 마찬가지로 쉘 스크립트 형식이나 리스트 형식으로 명령을 기술합니다.

차이점

그렇다면 CMD 명령과 ENTRYPOINT 명령의 차이는 무엇일까요? 가장 큰 차이점은 컨테이너 시작 시 실행 명령에 대한 디폴트 지정 여부입니다. ENTRYPOINT 명령으로 컨테이너 시작 시의 명령을 기술한 경우 docker container run 에서 주어진 옵션과 상관없이 무조건 ENTRYPOINT 에서 지정한 명령을 우선적으로 수행합니다. 하지만 CMD 명령을 사용하여 수행할 경우 docker container run 에서 주어진 옵션이 CMD 값을 대신하여 실행하게 됩니다. 다음 dockerfile을 빌드하고 컨테이너를 실행하면 컨테이너의 파일시스템의 용량 정보가 나오게 됩니다.

FROM ubuntu:latest
CMD ["/bin/df", "-h"]

하지만 docker container run 구문을 통해 현재 시스템에서 돌아가는 프로세스를 확인하는 ps -aef 명령을 주었을 때는 기존 CMD 명령이 생략되고 컨테이너 실행 시 받은 인자가 실행됩니다.


이번에는 ENTRYPOINT 명령을 이용해보겠습니다. 다음 dockerfile을 실행하고 컨테이너 실행 시 ps -aef 명령을 주었을 때에는 다음과 같이 에러가 발생합니다.

FROM ubuntu:latest
ENTRYPOINT ["/bin/df", "-h"]

이는 ENTRYPOINT 명령으로 지정한 컨테이너 실행 명령은 컨테이너 구동 시 전달된 인자와 별개로 무조건 유지하고 전달된 인자는 CMD로 받아 처리합니다. 즉, df -h ps -aef 와 같은 명령이 되기 때문에 에러가 발생하게 됩니다.


따라서 컨테이너가 수행될 때 변경되지 않을 실행 명령은 CMD 보다는 ENTRYPOINT 로 정의하는 것이 좋습니다. 또한 ENTRYPOINT 명령으로 지정한 명령에 실행 시에 명령 인수를 지정하고 싶을 때에는 CMD 명령과 조합하여 사용하는 것이 좋습니다. 즉, ENTRYPOINT 명령으로는 실행하고 싶은 명령 자체를 지정하고 CMD 명령으로는 그 명령의 디폴트 인수를 지정하면 컨테이너를 실행했을 때 기본 작동을 결정할 수 있습니다. 다음 dockerfile은 top 명령을 실행하면서 CMD 명령으로 10초 마다 갱신하는 인수를 추가합니다.

FROM ubuntu:latest
ENTRYPOINT ["top"]
CMD ["-d", "10"]

응용하여 "docker run run_sample -d 2" 를 수행하면 기존 CMD 명령으로 설정한 명령 인수가 덮어져 top 명령을 2초마다 갱신합니다. 

반응형

'Computer > Docker' 카테고리의 다른 글

Dockerfile (1) - 개요  (0) 2021.04.29
Docker container 실행 - docker run (2)  (0) 2021.04.14
Docker container 실행 - docker run (1)  (2) 2021.04.13
Docker 이미지 커맨드  (0) 2021.04.03
Docker의 작동 구조  (0) 2021.03.27