programing

도커 파일에서 RUN과 CMD의 차이

codeshow 2023. 10. 19. 22:51
반응형

도커 파일에서 RUN과 CMD의 차이

언제 사용해야 하는지 헷갈리네요.CMD.RUN. 예를 들어, bash/shell 명령을 실행합니다(즉, bash/shell 명령).ls -la) 항상 사용합니다.CMD아니면 제가 사용할 상황이 있나요?RUN? 이 두 가지 유사한 모범 사례를 이해하려고 합니다.Dockerfile

RUN은 이미지 빌드 단계로, 컨테이너의 상태는 다음과 같습니다.RUN명령이 컨테이너 이미지에 커밋됩니다.도커 파일은 다음과 같이 많은 파일을 가질 수 있습니다.RUN이미지를 구축하기 위해 층을 서로 겹치게 됩니다.

CMD는 빌드된 이미지를 실행할 때 컨테이너가 기본적으로 실행하는 명령입니다.도커 파일은 결승전만 사용합니다.CMD정의된. 더CMD다음을 사용하여 컨테이너를 시작할 때 무시할 수 있습니다.docker run $image $other_command.

엔트리 포인트(ENTRIENT POINT)는 또한 다음과 밀접한 관련이 있습니다.CMD그리고 a의 방식을 수정할 수 있습니다.CMD이미지에서 컨테이너를 시작할 때 해석됩니다.

RUN- 명령은 도커 이미지를 구축하는 동안 트리거합니다.

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

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

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

CMD - CMD 명령을 사용하면 기본 명령을 설정할 수 있으며, 명령을 지정하지 않고 컨테이너를 실행할 때만 실행됩니다.Docker 컨테이너가 명령과 함께 실행되면 기본 명령이 무시됩니다.Docker 파일에 두 개 이상의 CMD 명령이 있을 경우 마지막을 제외하고 모두 끝납니다.
CMD 지시는 무시됩니다.

기존의 답은 이 문제를 보는 사람이라면 무엇이 필요한지를 대부분 다루고 있습니다.그래서 CMD와 RUN을 위해 몇 가지 틈새 분야만 다루겠습니다.

CMD: 중복은 허용되지만 낭비됩니다.

진저 비어는 중요한 점을 강조합니다. CMD를 하나 이상 넣으면 오류가 나지 않는다는 것입니다. 하지만 그렇게 하는 것은 낭비입니다.예를 들어 설명하고 싶습니다.

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

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

CMD 2 실행 중

제가 생각하기에 "CMD"는 구축 중인 전체 이미지에 대해 단일 전역 변수를 설정하기 때문에 연속적인 "CMD" 문은 해당 전역 변수에 대한 이전 쓰기를 덮어쓰기만 하면 되고, 마지막으로 쓰기 위해 작성된 최종 이미지에서는 승리합니다.도커 파일은 위에서 아래로 순서대로 실행되기 때문에 가장 아래에 있는 CMD가 마지막으로 "쓰기"를 받는 것임을 알 수 있습니다.

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

RUN에 대한 미묘한 점은 부작용이 있더라도 순기능으로 취급되어 캐시가 된다는 것입니다.즉, RUN에 결과 이미지가 변경되지 않는 일부 부작용이 있고 해당 이미지가 이미 캐시된 경우에는 RUN이 다시 실행되지 않으므로 이후 빌드에서 부작용이 발생하지 않습니다.예를 들어 다음과 같은 도커 파일을 사용합니다.

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

에코 문이 위에서 실행되었음을 주목하십시오.두 번째로 실행하면 캐시가 사용되며 빌드의 출력에 에코가 표시되지 않습니다.

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

실행 - Python을 설치합니다. 이제 컨테이너에 Python이 이미지에 굽습니다.
CMD - python hello.py , 좋아하는 스크립트 실행

참고: RUN과 CMD를 혼동하지 마십시오. RUN은 실제로 명령을 실행하고 결과를 커밋합니다. CMD는 빌드 시에 아무것도 실행하지 않지만 이미지에 대한 의도된 명령을 지정합니다.

도커 파일 참조에서

https://docs.docker.com/engine/reference/builder/ #cmd

RUN 명령: RUN 명령은 기본적으로 이미지를 작성할 때 기본 명령을 실행합니다.또한 다음 단계에 대한 이미지 변경을 커밋합니다.

새 이미지를 작성하는 과정에 도움이 되는 RUN 명령은 1개 이상일 수 있습니다.

CMD Command: CMD Commands는 새 컨테이너에 대한 기본 명령만 설정합니다.빌드 시 실행되지 않습니다.

도커 파일에 1개 이상의 CMD 명령이 있으면 마지막 명령을 제외한 모든 명령이 무시됩니다.이 명령어는 아무것도 실행하지 않고 기본 명령어만 설정하기 때문입니다.

RUN: 여러 개일 수 있으며 여러 라이브러리 설치 등 빌드 프로세스에서 사용됩니다.

CMD: 실행 시작점인 1개만 가질 수 있습니다(예:["npm", "start"],["node", "app.js"])

RUNCMD에 대한 답은 충분합니다. ENTERPOINT에 대한 몇 단어만 추가하고 싶습니다. CMD 인수는 명령줄 인수로 덮어쓸 수 있지만 ENTERPOINT 인수는 항상 사용됩니다.

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

언급URL : https://stackoverflow.com/questions/37461868/difference-between-run-and-cmd-in-a-dockerfile

반응형