인프런 커뮤니티 질문&답변

잘열심히님의 프로필 이미지

작성한 질문수

개발자를 위한 쉬운 도커

도커파일(Dockerfile) 지시어

cmd와 run에 대해서 궁금한점이있습니다.!

해결된 질문

24.02.06 18:56 작성

·

375

1

1.RUN 명령어 실행(새로운 레이어 추가)
CMD["명령어"]컨테이너 실행시 명령어 지정

두개의 차이점이 이렇다고 하셨는데 어차피 컨테이너를 실행하는과정에서 처음에 실행되는것은 같은것같은데
차이점이:
CMD는 이미지당 1개 RUN은 여러개가 가능하며
레이어의 관점에서 CMD는 추가가 안되고 RUN의경우 레이어에 추가가되는 차이가 있는걸까요??

2.그리고
캡처.PNG해당 부분에서
docker run 실행명령을 통해서 적히는 부분은 CMD로만 적히고 컨테이너가 실행이 되고나서부터 실행하는것이 run으로 기록이 된다 라고 이해하면될까요?

답변 1

1

데브위키님의 프로필 이미지
데브위키
지식공유자

2024. 02. 07. 00:16

잘열심히님 안녕하세요, 데브위키입니다.

1번 질문이 경우 RUN 지시어와 CMD 지시어의 차이에 대해서 질문 주셨는데요!

RUN 지시어 같은 경우는 이미지를 빌드하는 시점에서 실행되는 명령어입니다!

그래서 컨테이너로 실행하는 시점에는 이미 RUN 지시어의 결과로 만들어진 레이어가 이미지에 포함되어 있습니다.

예를 들어 RUN npm install 이라는 지시어를 dockerfile의 지시어로 추가하실 경우,

docker build 명령을 사용해서 이미지를 제작하는 시점에 이미 npm install명령이 실행되고, 결과가 레이어로 추가되는 것입니다.

CMD 지시어의 경우 이미지를 컨테이너로 실행하는 시점에 실행되는 명령어입니다.

그래서 레이어가 별도로 추가되지 않고 메타데이터에만 저장되어 있다가, docker run 명령을 사용해서 컨테이너 레이어가 추가되는 시점에 명령어로 실행되는 것입니다.

 

2번 질문은 CMD지시어를 덮어씌우는 부분에 대해서 질문을 주셨는데요!

$ docker run -it --name officialNginx nginx bin/bash

 

이렇게 명령어를 실행하실 경우

nginx의 메타데이터에는 "nginx -g daemon off;"라는 CMD가 사전에 입력되어 있기 때문에 그대로 실행할 경우 nginx 웹서버가 실해됩니다.

1번 답변에서 말씀드렸던 것처럼 CMD지시어는 docker run 으로 컨테이너를 실행하는 시점에서 실행되기 때문에, docker run 명령을 사용해서 덮어씌울 수 있는 것입니다.

하지만 RUN지시어는 이미 이미지의 일부가 되어있기 때문에, 컨테이너를 실행하는 시점에서는 이미 실행이 된 상태입니다.

 

좋은 질문 감사합니다!

추가로 궁금하신점이 있으시면 댓글 부탁드립니다.

잘열심히님의 프로필 이미지
잘열심히
질문자

2024. 02. 07. 00:32

jar파일이나 어플리케이션의 소스코드들을 빌드하는 단계와같은 사전작업은 RUN명령어
실제 이미지에 빌드된 프로그램을 CMD명령을 통해 실행된다
라고 이해하면될까요?

데브위키님의 프로필 이미지
데브위키
지식공유자

2024. 02. 07. 00:53

네 맞습니다! 👍👍