[Docker] RUN과 CMD

멋쟁이 유진·2024년 4월 28일

Dockerfile 작성 중 헷갈렸던 RUN과 CMD에 대해 알아보려 한다.

RUN

RUN 명령어는 도커 이미지를 빌드 시 실행이 되는 명령어로, 이미지 생성 시에 새 레이어를 생성한다.
또한 이 명령어는 캐싱이 되어 다음 빌드 시에 재사용된다.

RUN 명령어는 주로 라이브러리 설치를 할 때 활용이 된다고 한다.
npm install 같은 라이브러리 설치는 dependency가 바뀌지 않는 이상 여러 번 할 필요 없으니까 캐싱해뒀다가 다시 사용해서 빌드 시간을 줄이면 되니까 RUN 명령어와 사용하는 것 같다.
(다음에 Docker 레이어와 캐싱에 대해서도 다시 공부해봐야겠다!)

아래와 같은 방법으로 긴 명령을 여러 줄로 나눠 사용할 수도 있다.

RUN <<EOF
apt-get update
apt-get install -y curl
EOF

CMD

CMD 명령어는 만든 이미지로부터 컨테이너를 실행 시 실행이 되는 명령어이다.
Dockerfile에는 하나의 CMD의 명령어만 있을 수 있으며, 두 개 이상의 CMD 명령어를 작성할 경우 마지막 항목만 적용이 된다.

테스트

CMD 명령어

아래와 같은 Dockerfile 생성 후 빌드 시,

FROM ubuntu

CMD ["echo", "CMD test"]

도커 허브에서 ubuntu 이미지를 가지고 오는 것은 확인이 되지만 CMD 부분은 확인이 되지 않는다.

그리고 아래 명령어로 실행 시

docker run cmd

CMD test가 출력된 후
컨테이너가 종료되었다.

RUN 명령어

반면, RUN 명령어를 사용했을 때에는 다른 결과를 볼 수 있었다.

아래와 같은 Dockerfile 생성 및 빌드 시

FROM ubuntu

RUN echo RUN!

우분투 이미지를 가져오는 FROM 명령어와(캐시 되었지만) RUN 명령어를 빌드 과정에서 모두 확인할 수 있으며,
한 번 더 동일한 내용으로 빌드 시
FROM 명령어 뿐만 아니라 echo 명령어가 있는 RUN 명령어도 캐시가 된것을 확인할 수 있다.

결론

RUN 명령어는 Dockerfile 빌드 시 실행되고 결과가 커밋되지만, CMD 명령어는 빌드할 때는 실행되지 않으며, 컨테이너 실행 시 실행되는 명령어이다.

이전에 공부할 때는 모르는 내용도 급하니까 그냥 넘어간 적이 많다. 하지만 이런식으로 정리하고 넘어가니까 더 이해가 가는 것 같다.

출처
https://docs.docker.com/reference/dockerfile/
https://seokhyun2.tistory.com/61

0개의 댓글