답변:
RUN 은 이미지 빌드 단계이며 RUN
명령 후 컨테이너 상태 는 컨테이너 이미지에 커밋됩니다. Dockerfile RUN
에는 이미지를 빌드하기 위해 서로 겹쳐지는 많은 단계가 있을 수 있습니다 .
CMD 는 빌드 된 이미지를 시작할 때 컨테이너가 기본적으로 실행하는 명령입니다. Dockerfile은 최종 CMD
정의 된 항목 만 사용합니다 . CMD
로 컨테이너를 시작할 때를 재정 의 할 수 있습니다 docker run $image $other_command
.
ENTRYPOINT 는 CMD
컨테이너가 이미지를 시작하는 방식과 밀접한 관련이 있으며 수정할 수 있습니다.
RUN
환경을 설정 하는 데 필요한 모든 작업을 수행하고 (만) CMD가 컨테이너에서 실행중인 프로세스 (예 : nginx의 경우)를 github.com/nginxinc/docker-nginx/blob/ 에서 추출 합니다.CMD ["nginx", "-g", "daemon off;"]
이 기사가 그들 간의 차이점을 이해하는 데 매우 도움 이 된다는 것을 알았 습니다
RUN -RUN 명령을 사용하면 필요한 응용 프로그램 및 패키지를 설치할 수 있습니다. 현재 이미지 위에서 모든 명령을 실행하고 결과를 커밋하여 새 레이어를 만듭니다. 종종 Dockerfile에 여러 개의 RUN 명령어가 있습니다.
CMD -CMD 명령을 사용하면 명령을 지정하지 않고 컨테이너를 실행할 때만 실행되는 기본 명령을 설정할 수 있습니다. Docker 컨테이너가 명령으로 실행되면 기본 명령이 무시됩니다. Dockerfile에 둘 이상의
CMD 명령이있는 경우 마지막 CMD 명령을 제외한 모든 명령이 무시됩니다.
RUN -Python을 설치하면 컨테이너에 파이썬이 이미지
CMD에 탔습니다
-python hello.py, 좋아하는 스크립트를 실행하십시오
참고 : RUN과 CMD를 혼동하지 마십시오. RUN은 실제로 명령을 실행하고 결과를 커밋합니다. CMD는 빌드시 아무 것도 실행하지 않지만 이미지의 의도 된 명령을 지정합니다.
도커 파일 참조에서
기존 답변은이 질문을 보는 사람이 필요로하는 대부분의 내용을 다룹니다. CMD와 RUN의 틈새 영역에 대해서만 다루겠습니다.
GingerBeer는 중요한 점을 지적합니다. 하나 이상의 CMD를 입력하면 오류가 발생하지 않지만 그렇게하는 것은 낭비입니다. 예를 들어 설명하고 싶습니다.
FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"
이것을 이미지로 빌드 하고이 이미지에서 컨테이너를 실행하면 GingerBeer가 말한 것처럼 마지막 CMD 만주의를 기울입니다. 따라서 해당 컨테이너의 출력은 다음과 같습니다.
CMD 2 실행
내가 생각하는 방식은 "CMD"가 빌드중인 전체 이미지에 대해 단일 전역 변수를 설정하는 것이므로 연속 "CMD"문은 해당 전역 변수에 대한 이전 쓰기를 덮어 쓰고 최종 이미지에서 마지막으로 승리를 기록하십시오. Dockerfile은 위에서 아래로 순서대로 실행되므로 맨 아래 CMD는이 최종 "쓰기"(비 유적으로 말하면)를 얻는 것입니다.
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