sourcetip

도커 파일에서 CMD와 엔트리 포인트의 차이점은 무엇입니까?

fileupload 2023. 9. 5. 20:44
반응형

도커 파일에서 CMD와 엔트리 포인트의 차이점은 무엇입니까?

파일에는 두 : 도커파일나유두사있가명습다니령이지한와.CMD그리고.ENTRYPOINT하지만 저는 그것들 사이에 (미묘하게?) 차이가 있다고 생각합니다. 그렇지 않으면 동일한 것에 대해 두 개의 명령을 갖는 것은 말이 되지 않을 것입니다.

설명서에는 다음과 같은 내용이 나와 있습니다.CMD-

CMD의 주요 목적은 실행 중인 컨테이너에 기본값을 제공하는 것입니다.

에 대해서도ENTRYPOINT:

엔트리 포인트는 실행 파일로 실행할 수 있는 컨테이너를 구성하는 데 도움이 됩니다.

그렇다면 이 두 명령의 차이점은 무엇일까요?

인 도에는다같기있진습다니이입점커본은음과▁a가 있습니다./bin/sh -c기본 명령이 없습니다.

과 같이 : 다과같도실행는경우하를:docker run -i -t ubuntu bash인 "진이기입니다값"입니다./bin/sh -c는 이지는입니다.ubuntu는 명은다과같습다니음령다▁and입니다.bash.

은 명은진을통실다니됩행해즉것. 로, 는되은행실실제입점령입니다./bin/sh -c bash를 통해 는 이통해도를 구현할 수 .RUN껍질의 파서에 의존하여 빠르게.

나중에, 사람들은 이것을 사용자 정의할 수 있게 해달라고 요청했습니다.ENTRYPOINT그리고.--entrypoint소개되었습니다.

이름 모든 것, 지이뒤있에모것은든는름이미▁the,ubuntu위의 예에서 는 명령이며 진입점으로 전달됩니다.CMD, 정히당실행있는것같다습니과고하신이확을 실행하는 .
docker run -i -t ubuntu <cmd>
는 진입점의매변다같음습다니과수는입니다.<cmd>.

을 대신 .docker run -i -t ubuntuUbuntu Docker 파일에서는 기본값이기 때문에 bash 셸이 컨테이너에서 시작됩니다.CMD지정됨:
CMD ["bash"].

모든 것이 진입점으로 전달되기 때문에, 당신은 당신의 이미지로부터 매우 멋진 행동을 할 수 있습니다.@지리 예제가 좋습니다. 이미지를 "이진"으로 사용하는 방법을 보여줍니다.을 할 때["/bin/cat"]시작점으로서 그리고 나서 하는.docker run img /etc/passwd 어요겠./etc/passwd "" "" "" "" "" ""로 수행됩니다./bin/cat /etc/passwd.

또 다른 예는 임의의 class 진입점을 갖는 것입니다.를 들어,가 있는 에는 실행하는 redis 이미지를 합니다.docker run redisimg redis -H something -u toto get key당신은 간단히 가질 수 있습니다.ENTRYPOINT ["redis", "-H", "something", "-u", "toto"]결과를 위해 합니다: 동일한결과대같실행이합니다과다음해에▁and.docker run redisimg get key.

ENTRYPOINT컨테이너가 시작될 때 항상 실행될 명령을 지정합니다.

CMD 인수지다니에 합니다.ENTRYPOINT.

특정명전이를만들사용다니합면려미지용을 합니다.ENTRYPOINT ["/path/dedicated_command"]

그렇지 않으면, 일반적인 목적으로 이미지를 만들고 싶다면, 당신은 떠날 수 있습니다.ENTRYPOINT 특정및사를 사용합니다.CMD ["/path/dedicated_command"] 수 입니다.docker run.

예를 들어 Docker 파일이 다음과 같은 경우:

FROM debian:wheezy
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]

인수 없이 이미지를 실행하면 localhost:

$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.096 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.088 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.088/0.091/0.096/0.000 ms

이제 인수를 사용하여 이미지를 실행하면 인수 ping이 수행됩니다.

$ docker run -it test google.com
PING google.com (173.194.45.70): 48 data bytes
56 bytes from 173.194.45.70: icmp_seq=0 ttl=55 time=32.583 ms
56 bytes from 173.194.45.70: icmp_seq=2 ttl=55 time=30.327 ms
56 bytes from 173.194.45.70: icmp_seq=4 ttl=55 time=46.379 ms
^C--- google.com ping statistics ---
5 packets transmitted, 3 packets received, 40% packet loss
round-trip min/avg/max/stddev = 30.327/36.430/46.379/7.095 ms

비교를 위해 Docker 파일이 다음과 같은 경우:

FROM debian:wheezy
CMD ["/bin/ping", "localhost"]

인수 없이 이미지를 실행하면 localhost:

$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.087 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.090 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.076/0.084/0.090/0.000 ms

그러나 인수를 사용하여 이미지를 실행하면 다음 인수가 실행됩니다.

docker run -it test bash
root@e8bb7249b843:/#

자세한 내용은 Brian DeHamer의 이 기사를 참조하십시오. https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/

도커 문서에 따르면,

CMD 및 ENTRYPOINT 명령어는 컨테이너를 실행할 때 실행할 명령어를 정의합니다.그들의 협력을 설명하는 몇 가지 규칙이 있습니다.

  1. 은 적어도 .CMD또는ENTRYPOINT명령을 실행합니다.
  2. ENTRYPOINT컨테이너를 실행 파일로 사용할 때 정의해야 합니다.
  3. CMD의 기본 인수를 정의하는 방법으로 사용해야 합니다.ENTRYPOINT또는 컨테이너에서 애드혹 명령을 실행하기 위한 명령입니다.
  4. CMD대체 인수를 사용하여 컨테이너를 실행할 때 재정의됩니다.

아래 표에는 다양한 / 조합에 대해 실행되는 명령이 나와 있습니다.

-- No ENTRYPOINT

╔════════════════════════════╦═════════════════════════════╗
║ No CMD                     ║ error, not allowed          ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD ["exec_cmd", "p1_cmd"] ║ exec_cmd p1_cmd             ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD ["p1_cmd", "p2_cmd"]   ║ p1_cmd p2_cmd               ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD exec_cmd p1_cmd        ║ /bin/sh -c exec_cmd p1_cmd  ║
╚════════════════════════════╩═════════════════════════════╝

-- ENTRYPOINT exec_entry p1_entry

╔════════════════════════════╦══════════════════════════════════╗
║ No CMD                     ║ /bin/sh -c exec_entry p1_entry   ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD ["exec_cmd", "p1_cmd"] ║ /bin/sh -c exec_entry p1_entry   ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD ["p1_cmd", "p2_cmd"]   ║ /bin/sh -c exec_entry p1_entry   ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD exec_cmd p1_cmd        ║ /bin/sh -c exec_entry p1_entry   ║
╚════════════════════════════╩══════════════════════════════════╝

-- ENTRYPOINT ["exec_entry", "p1_entry"]

╔════════════════════════════╦═════════════════════════════════════════════════╗
║ No CMD                     ║ exec_entry p1_entry                             ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD ["exec_cmd", "p1_cmd"] ║ exec_entry p1_entry exec_cmd p1_cmd             ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD ["p1_cmd", "p2_cmd"]   ║ exec_entry p1_entry p1_cmd p2_cmd               ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD exec_cmd p1_cmd        ║ exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd  ║
╚════════════════════════════╩═════════════════════════════════════════════════╝

네, 좋은 질문입니다.아직 완전히 이해하지는 못했지만:

는 그것을 합니다.ENTRYPOINT실행 중인 이진수입니다.--entrypoint"--entrypoint="로 수 .

docker run -t -i --entrypoint="/bin/bash" ubuntu

CMD는 컨테이너에 대한 기본 인수입니다.진입점이 없는 경우 기본 인수는 실행되는 명령입니다.진입점의 경우 cmd가 진입점에 인수로 전달됩니다.진입점을 사용하여 명령을 에뮬레이트할 수 있습니다.

# no entrypoint
docker run ubuntu /bin/cat /etc/passwd

# with entry point, emulating cat command
docker run --entrypoint="/bin/cat" ubuntu /etc/passwd

따라서 주요 이점은 진입점을 사용하여 인수(cmd)를 컨테이너에 전달할 수 있다는 것입니다.이 작업을 수행하려면 다음 두 가지를 모두 사용해야 합니다.

# Dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/cat"]

그리고.

docker build -t=cat .

그러면 다음을 사용할 수 있습니다.

docker run cat /etc/passwd
#              ^^^^^^^^^^^
#                   CMD
#          ^^^      
#          image (tag)- using the default ENTRYPOINT

간단히 말해서,

  • 기본 및변수를 합니다. 실행될 때 수 (CMD 진또및입기명본/령는매개설다니변정합수를에점는또▁cmdcm▁line다▁when니및설▁runs▁be매/정point합▁commandeters변▁commandwritten▁to개▁and,▁can▁from▁entry는▁over▁dock▁default▁which▁sets 이는 도커 컨테이너가 실행될 때 명령줄에서 덮어쓸 수 있습니다(docker run example "override").
  • 가 있는 앞에 덮어씁니다(ENTRYPOINT 명덮앞다니어씁에상영는있가그래령줄령플체은자).docker run --entrypoint="override" image그러면 모든 CMD 인수가 ENTRYPOINT 뒤에 매개 변수로 추가됩니다.은 대분의경진다같음설이정다니됩과로 됩니다.sh -c은 서에찾수있다니습에서 수 .docker inspect image -f '{{ .Config.Entrypoint }}'
  • 둘 다 결합할 수 있습니다. (docker run --entrypoint="/docker-entrypoint.sh" image arg1 arg2)

더 많은 세부 정보가 필요하거나 예를 들어 차이점을 보고 싶다면 CMD와 ENTRYPOINT를 많은 예와 종합적으로 비교하는 블로그 게시물이 있습니다. - https://codewithyury.com/docker-run-vs-cmd-vs-entrypoint/

직관에 의한 CMD와 ENTRYPOINT의 차이:

  • Entrypoint: 컨테이너가 시작될 때 실행할 명령입니다.
  • CMD: 컨테이너가 시작될 때 실행할 명령 또는 지정된 경우 ENTRYPOINT에 대한 인수입니다.

네, 헷갈리네요.

도커 실행을 실행할 때 이들 중 하나를 재정의할 수 있습니다.

CMD와 ENTRYPOINT의 차이점은 다음과 같습니다.

docker run -it --rm yourcontainer /bin/bash            <-- /bin/bash overrides CMD
                                                       <-- /bin/bash does not override ENTRYPOINT
docker run -it --rm --entrypoint ls yourcontainer      <-- overrides ENTRYPOINT with ls
docker run -it --rm --entrypoint ls yourcontainer  -la  <-- overrides ENTRYPOINT with ls and overrides CMD with -la

차이점에 대한 자세한 내용은 다음과 같습니다.CMD그리고.ENTRYPOINT:

에 대한 docker runbin/bash에서 합니다.

는 런 에 "ENTRINE POINT"와 일반 할 수 .docker run [args].args에의 docker run [args]ENTRINEPOINT에 대한 인수로 제공됩니다.이런 식으로 우리는 다음을 만들 수 있습니다.container는 그은다음같일이같은습진다니와수반인적과것과 같은 .ls.

따라서 CMD가 ENTRYPOINT에 대한 기본 매개 변수로 작용할 수 있으며 [args]에서 CMD 인수를 재정의할 수 있습니다.

는 진점은재수있습다니될로 수.--entrypoint.

차이점을 더 잘 이해하는 데 도움이 될 수 있는 예로1 제 답변을 추가하겠습니다.

시작할 때 항상 절전 명령을 실행하는 이미지를 생성하려고 합니다.자체 이미지를 만들고 새 명령을 지정합니다.

FROM ubuntu
CMD sleep 10

이미지 구축:

docker build -t custom_sleep .
docker run custom_sleep
# sleeps for 10 seconds and exits

만약 우리가 초수를 바꾸고 싶다면요?우리는 그것을 바꿔야 할 것입니다.Dockerfile값이 하드 코딩되어 있으므로 다른 명령을 제공하여 명령을 재정의합니다.

docker run custom_sleep sleep 20

이것이 작동하는 동안에는 중복 "절전" 명령이 있기 때문에 좋은 해결책은 아닙니다.왜 중복됩니까?컨테이너의 유일한 목적은 수면이기 때문에, 지정해야 합니다.sleep명령이 명시적으로 약간 어색합니다.

이제사용보다니겠습해를 사용해 .ENTRYPOINT지침:

FROM ubuntu
ENTRYPOINT sleep

지침은 컨테이너가 시작될 때 실행될 프로그램을 지정합니다.

이제 실행할 수 있습니다.

docker run custom_sleep 20

기본값은 어떻게 됩니까?음, 당신은 그것을 옳게 추측했습니다.

FROM ubuntu
ENTRYPOINT ["sleep"]
CMD ["10"]

ENTRYPOINT실행될 프로그램이며 컨테이너에 전달된 값이 추가됩니다.

ENTRYPOINT할 수 .--entrypoint플래그 다음에 사용할 새 진입점을 입력합니다.

제 것이 아닙니다. 저는 이 예를 제공하는 튜토리얼을 본 적이 있습니다.

그것에 대한 몇 가지 좋은 답이 있습니다.데모 문서를 통해 설명하고 싶습니다.

  • CMD 컨테이너의 기본 명령 및/또는 매개 변수를 정의합니다.CMD는 사용자가 쉽게 재정의할 수 있는 기본 명령이 필요한 경우 사용하는 것이 가장 좋습니다.Docker 파일에 여러 CMD가 있는 경우 마지막 파일의 지침만 적용됩니다.
  • ENTRYPOINT 특정 실행 파일을 사용하여 컨테이너를 정의하려는 경우 선호됩니다.

을 덮어쓸 수 .ENTRYPOINT는 가하지않한컨때시작할를너테이를 합니다.--entrypoint 깃발

  1. CMD

도커 파일

  FROM centos:8.1.1911

  CMD ["echo", "Hello Docker"]

실행 결과

$ sudo docker run <image-id>
Hello Docker
$ sudo docker run <image-id> hostname   # hostname is exec to override CMD
244be5006f32
  1. 진입점

도커 파일

  FROM centos:8.1.1911

  ENTRYPOINT ["echo", "Hello Docker"]

실행 결과

$ sudo docker run <image-id>
Hello Docker
$ sudo docker run <image-id> hostname   # hostname as parameter to exec
Hello Docker hostname
  1. CMD와 ENTRYPOINT를 결합하는 것이 도커 컨테이너에 가장 적합한 솔루션이 될 수 있습니다.이러한 경우 실행 파일은 ENTRYPOINT로 정의되고 CMD는 기본 매개 변수를 지정합니다.

도커 파일

  FROM centos:8.1.1911

  ENTRYPOINT ["echo", "Hello"]
  CMD ["Docker"]

실행 결과

$ sudo docker run <image-id>
Hello Docker
$ sudo docker run <image-id> Ben
Hello Ben

받아들여진 대답은 역사를 설명하는 데 있어 훌륭합니다.다음 표는 'CMD와 ENTRINEPOINT의 상호 작용 방식'에 대한 공식 문서에서 매우 잘 설명되어 있습니다.

저는 이것을 우연히 발견했고 처음에는 정직하게 말하는 것이 정말 혼란스럽다는 것을 알았습니다. 그리고 저는 이 혼란이 "CMD"라는 단어를 사용하는 것에서 비롯되었다고 생각합니다. 왜냐하면 실제로 거기에 있는 것이 논쟁으로 작용하기 때문입니다.그래서 조금 파고 난 후에 저는 그것이 어떻게 작동하는지 이해했습니다.기본적으로:

ENTRINEPOINT --> 여기서 지정하는 것은 컨테이너가 시작될 때 실행할 명령입니다.이 정의를 생략할 경우 도커는 다음을 사용합니다./bin/sh -c bash컨테이너를 실행할 수 있습니다.

CMD --> 사용자가 일부 사용자 지정 인수(예:docker run ubuntu <custom_cmd>섹션의 내용을 " CMD 파일"을 합니다.ENTRYPOINT <custom_cmd>되지 않은 , 은 ENTRINE 됩니다./bin/sh -c실제로 컨테이너를 시작할 때 실행할 명령으로 작동합니다.

모든 것처럼 무슨 일이 일어나고 있는지 예를 들어 설명하는 것이 좋습니다.다음 사양 Docker 파일을 사용하여 간단한 Docker 이미지를 생성한다고 가정합니다.

From ubuntu
ENTRYPOINT ["sleep"]

그런 다음 다음을 실행하여 빌드합니다.

docker build . -t testimg

이렇게 하면 실행할 때마다 절전 모드로 전환되는 컨테이너가 만들어집니다.따라서 다음과 같이 실행하면 다음과 같습니다.

docker run testimg

다음과 같은 정보를 얻을 수 있습니다.

sleep: missing operand
Try 'sleep --help' for more information.

이것은 진입점이 인수가 필요한 "절전" 명령이기 때문에 발생합니다.따라서 이 문제를 해결하기 위해 수면 시간을 제공합니다.

docker run testimg 5

이 작업은 올바르게 실행되며, 결과적으로 용기가 실행되고 5초 동안 절전 모드로 전환된 후 종료됩니다.볼 수 이진 파일에 했습니다.docker run testimg <my_cmd>기본값(default 인수)을 진입점에 전달하려면 어떻게 됩니까? 경우에는 CMD 섹션에서 다음과 같이 지정하면 됩니다.

From ubuntu
ENTRYPOINT ["sleep"]
CMD ["10"]

이 경우 사용자가 인수를 전달하지 않으면 컨테이너는 기본값(10)을 사용하여 진입점 절전 모드로 전달합니다.

이제 CMD만 사용하고 ENTRINEPOINT 정의는 생략하겠습니다.

FROM ubuntu
CMD ["sleep", "5"]

이 이미지를 다시 빌드하고 실행하면 기본적으로 5초 동안 절전 모드가 됩니다.

요약하면, 컨테이너를 실행 파일로 사용하기 위해 엔트리 포인트를 사용할 수 있습니다.CMD를 사용하여 진입점에 기본 인수를 제공하거나 사용자가 외부에서 재정의할 수 있는 컨테이너를 시작할 때 사용자 지정 명령을 실행할 수 있습니다.

CMD, RUN, ENTRIN POINT의 차이점을 쉽게 구분하고 싶습니다.

노드에 대한 npm init 예를 들어 보겠습니다.

CMD:

아래가 도커 파일에 추가한 초기 명령이라고 가정합니다.

CMD [ "npm", "init" ]

가 내, 가뛰면을 하면,docker run -t node npm install

도커 파일에서 npm init 명령을 재정의합니다.

CMD [ "npm", "init" ] This will become  CMD [ "npm", "install" ]

은 을실니다합행다음을 합니다.npm installnpm init installnpm으로 되므로.

이제 다음에 대해 이야기해 보겠습니다.

진입점:

동일한 명령이 도커 파일에 추가되지만 ENTRYPOINT를 사용한다고 가정합니다.

ENTRYPOINT [ "npm", "init" ]

가 내, 가뛰면을 하면,docker run -t node install

도커 파일에 npm install과 함께 npm init 명령을 추가합니다.

ENTRYPOINT [ "npm", "init" ] This will become  ENTRYPOINT [ "npm", "init", "install" ]

npm init 및 npm install 명령을 모두 실행합니다.

요약:

실행: 이미지가 생성되는 동안 실행됩니다.node_modules와 같은 종속성을 설치하는 데 사용됩니다.RUN npm install

CMD : 전체 명령을 재정의할 때 사용합니다.

엔트리 포인트: 일부 추가 명령을 추가할 때 사용합니다.

저는 모든 답변을 읽었으며, 다음과 같이 한 눈에 더 잘 이해할 수 있도록 요약하고자 합니다.

첫째, 컨테이너에서 실행되는 전체 명령은 명령과 인수의 두 부분을 포함합니다.

  • ENTRYPOINT는 컨테이너가 시작될 때 호출되는 실행 파일을 정의합니다(명령용).

  • CMD는 ENTRINEPOINT에 전달되는 인수를 지정합니다(인수의 경우).

쿠베르네테스액션 책에서 그것에 대한 중요한 메모를 지적합니다.(7인치)

CMD 명령을 사용하여 이미지를 실행할 때 실행할 명령을 지정할 수 있지만 올바른 방법은 ENTRYPOINT 명령을 통해 실행하고 기본 인수를 정의하려는 경우에만 CMD를 지정하는 것입니다.

또한 이 기사를 읽고 간단한 방법으로 훌륭한 설명을 할 수 있습니다.

코드의 EntryPoint 함수에 대한 주석

엔트리 포인트 /usr/sbin/nginx.

진입점(기본값은 sh -c)을 /usr/sbin/nginx로 설정합니다.

CMD를 /usr/sbin/nginx에 대한 인수로 수락합니다.

문서의 다른 참조

ENTRYPOINT의 exec 형식을 사용하여 상당히 안정적인 기본 명령 및 인수를 설정한 다음 CMD를 사용하여 변경될 가능성이 높은 추가 기본값을 설정할 수 있습니다.

예:

FROM ubuntu:14.04.3
ENTRYPOINT ["/bin/ping"]
CMD ["localhost", "-c", "2"]

빌드: sudo docker build -tent_cmd.

CMD arguments are easy to override.

NO argument (sudo docker -it ent_cmd)                :  ping localhost 
argument    (sudo docker run -it ent_cmd google.com) :  ping google.com

.

To override EntryPoint argument, you need to supply entrypoint
sudo docker run -it --entrypoint="/bin/bash" ent_cmdd

p.s: EntryPoint가 있는 경우 CMD는 EntryPoint에 피드할 인수를 보유합니다.EntryPoint가 없는 경우 CMD가 실행되는 명령이 됩니다.

CMD:

  • CMD ["executable","param1","param2"]:["executable","param1","param2"]첫 번째 프로세스입니다.
  • CMD command param1 param2:/bin/sh -c CMD command param1 param2첫 번째 프로세스입니다.CMD command param1 param2첫 번째 프로세스에서 분기됩니다.
  • CMD ["param1","param2"]은 " 양다음대기인제데사다니됩용공는하이수를본한식에은▁arguments"에 대한 기본 하는 데 됩니다.ENTRYPOINT.

ENTRINEPOINT(다음 목록에서는 CMD와 ENTRINEPOINT를 함께 사용하는 경우를 고려하지 않습니다)

  • ENTRYPOINT ["executable", "param1", "param2"]:["executable", "param1", "param2"]첫 번째 프로세스입니다.
  • ENTRYPOINT command param1 param2:/bin/sh -c command param1 param2첫 번째 프로세스입니다.command param1 param2첫 번째 프로세스에서 분기됩니다.

creak의 말대로 CMD가 먼저 개발되었습니다.그런 다음 더 많은 사용자 지정을 위해 엔트리 포인트가 개발되었습니다.함께 설계되지 않았기 때문에 CMD와 ENTRYPOINT 사이에 일부 기능이 중복되어 사용자를 혼동하는 경우가 많습니다.

대부분의 사람들이 여기서 완벽하게 설명하기 때문에 모든 답을 반복하지 않겠습니다.하지만 좋은 느낌을 얻기 위해서는 용기의 프로세스를 보고 직접 테스트하는 것이 좋습니다.

다음 양식의 작은 도커 파일을 만듭니다.

FROM ubuntu:latest
CMD /bin/bash

구축 기실능으로 합니다.docker run -it theimage그리고 실행ps -eo ppid,pid,args ps에서 비교합니다.: ps에서 받은 출력입니다.

  • docker run -it theimage bash
  • 를 하지만 사용하는 ENTRYPOINT /bin/bash그리고 그것을 두 가지 방법으로 운영합니다.
  • 용사를 합니다.CMD ["/bin/bash"]
  • ...

이렇게 하면 모든 가능한 방법 간의 차이를 쉽게 확인할 수 있습니다.

Docker 파일 모범 사례의 공식 문서는 차이점을 잘 설명합니다.도커 파일 모범 사례

CMD:

CMD 명령을 사용하여 이미지에 포함된 소프트웨어와 인수를 실행해야 합니다.CMD는 거의 항상 다음과 같은 형태로 사용되어야 합니다.CMD ["executable", "param1", "param2"…]이미지가 및 Rails와 에는 따서이미 Apache 및 Rails 은와용경다같다실과 같은 것을 할 수 .CMD ["apache2","-DFOREGROUND"]실제로 모든 서비스 기반 이미지에는 이 형식의 지침이 권장됩니다.

진입점:

ENTRYPOINT의 가장 좋은 사용 방법은 이미지의 기본 명령을 설정하여 해당 명령과 동일하게 이미지를 실행할 수 있도록 하는 것입니다(기본 플래그로 CMD를 사용).

도커 파일은 CMD 또는 ENTRINEPOINT 명령을 하나 이상 지정해야 합니다.

도커 파일의 마지막 CMD 및 ENTRYPOINT만 사용됩니다.

컨테이너를 실행 파일로 사용할 때 ENTRINE POINT를 정의해야 합니다.

CMD 명령을 사용하여 ENTRYPOINT로 정의된 명령에 대한 기본 인수를 정의하거나 컨테이너에서 애드혹 명령을 실행해야 합니다.

대체 인수를 사용하여 컨테이너를 실행하면 CMD가 재정의됩니다.

ENTRYPOINT는 이미지를 사용하여 컨테이너를 만들 때마다 사용되는 구체적인 기본 응용프로그램을 설정합니다.

ENTRINEPOINT를 CMD와 연결하면 CMD에서 실행 파일을 제거하고 해당 인수를 그대로 두고 ENTRINEPOINT로 전달할 수 있습니다.

ENTRYPOINT의 가장 좋은 사용 방법은 이미지의 기본 명령을 설정하여 해당 명령과 동일하게 이미지를 실행할 수 있도록 하는 것입니다(기본 플래그로 CMD 사용)

CMD가 언명급령된 되었습니다.Dockerfile다음을 통해 파일을 재정의할 수 있습니다.docker run명령하는 동안ENTRYPOINT그럴 리가 없습니다.

OS 이미지를 처음부터 다시 빌드하는 것(그냥 쓰기)FROM scratch파일에 COPY로 ) 저는.

도커 파일에 ENTRYPOINT 및 CMD를 지정하지 않으면 도커가

/bin/sh -c

컨테이너를 실행하는 동안 도커 파일에서 CMD를 정의하거나 명령줄 인수(정의된 CMD를 재정의함)를 전달하면 기본 ENTRINEPOINT로 CMD를 사용합니다.

하거나 도커 정의한다고 합니다.ls그러면 엔트리 포인트로 전송됩니다. 것은그,,

/bin/sh -c ls

/bin/sh -c어떤 주장이 전달되든 실행할 것입니다."됩니다.ls" 명령어는 다음과 같습니다.


ENTRINEPOINT를 는 Ubuntu를 사용합니다./bin/sh -c 즉,되어 있습니다.bash즉, 다음 명령을 실행하여 컨테이너를 실행할 때

docker container run -it ubuntu

도커는 실제로 엔트리 포인트를 다음과 같이 사용합니다. /bin/sh -c그리고 나서 그것을 먹입니다.bash으로 실행되는 은 리고궁으로실그것은는입니다.

/bin/sh -c bash

bash 합니다("bash" "bash" (으)로 표시되는 에만 해당).-i플래그는 위와 같이 지정되며 선택적으로 -t를 사용하여 기본 터미널과 같은 경험을 얻을 수 있습니다.

명줄을 제공경는하우인통수를해령bash는 전달한 그에 . 즉, e 이 통 과 즉 당 따 라 됩 니 다

/bin/sh -c passed_argument

기본 엔트리를 재정의하는 사용자 지정 엔트리 포인트를 정의할 수 있지만 그에 따라 CMD를 사용해야 합니다.

RUNfile의 된 도파의명정의것을않고습다니지려하를.ENTRYPOINT그리고.CMD 중간 합니다.

언급URL : https://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile

반응형