Dockerfile에서 RUN과 CMD의 차이점


답변:


426

RUN 은 이미지 빌드 단계이며 RUN명령 후 컨테이너 상태 는 컨테이너 이미지에 커밋됩니다. Dockerfile RUN에는 이미지를 빌드하기 위해 서로 겹쳐지는 많은 단계가 있을 수 있습니다 .

CMD 는 빌드 된 이미지를 시작할 때 컨테이너가 기본적으로 실행하는 명령입니다. Dockerfile은 최종 CMD정의 된 항목 만 사용합니다 . CMD로 컨테이너를 시작할 때를 재정 의 할 수 있습니다 docker run $image $other_command.

ENTRYPOINTCMD컨테이너가 이미지를 시작하는 방식과 밀접한 관련이 있으며 수정할 수 있습니다.


15
RUN환경을 설정 하는 데 필요한 모든 작업을 수행하고 (만) CMD가 컨테이너에서 실행중인 프로세스 (예 : nginx의 경우)를 github.com/nginxinc/docker-nginx/blob/ 에서 추출 합니다.CMD ["nginx", "-g", "daemon off;"]
user2915097

"Dockerfile은 하나의 CMD 만 가질 수 있습니다"– 기술적으로는 아니지만 실제로는 하나만 제외하고는 모두 무시됩니다. GingerBeer의 답변을 참조하십시오.
Colm Bhandal

"Dockerfile은 정의 된 최종 CMD 만 사용합니까?" 실제로 정의 된 최종 CMD는 이미지를 컨테이너로 시작하는 데 사용됩니다.
Paul cheung

1
예 @paulcheung dockerfile의 최종 명령은 이미지에 기록되며 빌드 된 이미지를 시작할 때 컨테이너가 기본적으로 실행하는 명령입니다.
매트

126

RUN -docker 이미지를 빌드하는 동안 명령이 트리거됩니다.

CMD -생성 된 도커 이미지를 시작하는 동안 명령이 트리거됩니다.


67

기사가 그들 간의 차이점을 이해하는 데 매우 도움 된다는 것을 알았 습니다

RUN -RUN 명령을 사용하면 필요한 응용 프로그램 및 패키지를 설치할 수 있습니다. 현재 이미지 위에서 모든 명령을 실행하고 결과를 커밋하여 새 레이어를 만듭니다. 종종 Dockerfile에 여러 개의 RUN 명령어가 있습니다.

CMD -CMD 명령을 사용하면 명령을 지정하지 않고 컨테이너를 실행할 때만 실행되는 기본 명령을 설정할 수 있습니다. Docker 컨테이너가 명령으로 실행되면 기본 명령이 무시됩니다. Dockerfile에 둘 이상의
CMD 명령이있는 경우 마지막 CMD 명령을 제외한 모든 명령이 무시됩니다.


13

RUN -Python을 설치하면 컨테이너에 파이썬이 이미지
CMD에 탔습니다 -python hello.py, 좋아하는 스크립트를 실행하십시오


CMD -Python을 설치하면 컨테이너가 이미지에 파이썬을 태우지 않았습니까?
Carlos Fontes

RUN은 python의 이미지 레이어를 생성하고, CMD는 단순히 이미지를 생성하지 않는 명령을 실행합니다
Rohit Salecha

8

RUN 명령 : RUN 명령은 기본적으로 이미지를 빌드 할 때 기본 명령을 실행합니다. 또한 다음 단계를 위해 이미지 변경 사항을 커밋합니다.

새로운 이미지를 만드는 과정을 돕기 위해 하나 이상의 RUN 명령이있을 수 있습니다.

CMD 명령 : CMD 명령은 새 컨테이너의 기본 명령 만 설정합니다. 빌드시 실행되지 않습니다.

도커 파일에 둘 이상의 CMD 명령이있는 경우 마지막 명령을 제외한 모든 명령이 무시됩니다. 이 명령은 아무것도 실행하지 않고 기본 명령 만 설정합니다.



4

RUN : 많을 수 있으며 빌드시 사용 프로세스 됩니다 (예 : 여러 라이브러리 설치)

CMD : 만 1, 가질 수 실행 시작 지점을 (예를 들어 ["npm", "start"], ["node", "app.js"])


2

RUNCMD 에 대한 충분한 답변이 있습니다 . ENTRYPOINT에 몇 단어를 추가하고 싶습니다 . CMD 인수는 명령 행 인수로 겹쳐 쓸 수 있지만 ENTRYPOINT 인수는 항상 사용됩니다.

이 기사 는 좋은 정보원입니다.


2

기존 답변은이 질문을 보는 사람이 필요로하는 대부분의 내용을 다룹니다. CMD와 RUN의 틈새 영역에 대해서만 다루겠습니다.

CMD : 중복은 허용되지만 낭비

GingerBeer는 중요한 점을 지적합니다. 하나 이상의 CMD를 입력하면 오류가 발생하지 않지만 그렇게하는 것은 낭비입니다. 예를 들어 설명하고 싶습니다.

FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"

이것을 이미지로 빌드 하고이 이미지에서 컨테이너를 실행하면 GingerBeer가 말한 것처럼 마지막 CMD 만주의를 기울입니다. 따라서 해당 컨테이너의 출력은 다음과 같습니다.

CMD 2 실행

내가 생각하는 방식은 "CMD"가 빌드중인 전체 이미지에 대해 단일 전역 변수를 설정하는 것이므로 연속 "CMD"문은 해당 전역 변수에 대한 이전 쓰기를 덮어 쓰고 최종 이미지에서 마지막으로 승리를 기록하십시오. Dockerfile은 위에서 아래로 순서대로 실행되므로 맨 아래 CMD는이 최종 "쓰기"(비 유적으로 말하면)를 얻는 것입니다.

RUN : 이미지가 캐시 된 경우 명령이 실행되지 않을 수 있음

RUN에 대해 알아야 할 미묘한 점은 부작용이 있어도 순수한 기능으로 취급되어 캐시된다는 것입니다. 이는 RUN에 결과 이미지를 변경하지 않는 부작용이 있고 해당 이미지가 이미 캐시 된 경우 RUN이 다시 실행되지 않으므로 후속 빌드에서 부작용이 발생하지 않음을 의미합니다. 예를 들어 다음 Dockerfile을 사용하십시오.

FROM busybox
RUN echo "Just echo while you work"

처음 실행할 때 다른 영숫자 ID로 다음과 같은 출력을 얻습니다.

docker build -t example/run-echo .
Sending build context to Docker daemon  9.216kB
Step 1/2 : FROM busybox
 ---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
 ---> Running in ed37d558c505
Just echo while you work
Removing intermediate container ed37d558c505
 ---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest

echo 문은 위에서 실행되었습니다. 두 번째로 실행하면 캐시가 사용되며 빌드 출력에 에코가 표시되지 않습니다.

docker build -t example/run-echo .
Sending build context to Docker daemon  9.216kB
Step 1/2 : FROM busybox
 ---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
 ---> Using cache
 ---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.