Dockerfile에서 CMD와 ENTRYPOINT의 차이점은 무엇입니까?


4 Answers

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

CMDENTRYPOINT 될 인수를 지정합니다.

특정 명령 전용 이미지를 만들려면 ENTRYPOINT ["/path/dedicated_command"]

그렇지 않으면 일반 용도로 이미지를 만들려면 ENTRYPOINT 지정하지 않고 CMD ["/path/dedicated_command"] 를 사용하여 docker run 인수를 제공하여 설정을 무시할 수 docker run .

예를 들어, Dockerfile이 다음과 같은 경우 :

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

인수없이 이미지를 실행하면 localhost를 ping합니다.

$ 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

비교를 위해 Dockerfile이 다음과 같은 경우 :

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

인수없이 이미지를 실행하면 localhost를 ping합니다.

$ 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/

Question

Dockerfiles에는 CMDENTRYPOINT 와 비슷한 두 개의 명령이 있습니다. 그러나 나는 그들 사이에 (미묘한) 차이가 있다고 생각합니다. 그렇지 않으면 똑같은 것을 위해 두 가지 명령을 갖는 것이 의미가 없습니다.

CMD 대한 문서 상태

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

ENTRYPOINT :

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

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




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

  • ENTRYPOINT : 컨테이너가 시작될 때 실행할 명령.
  • CMD : 컨테이너가 시작될 때 실행할 명령 또는 ENTRYPOINT에 대한 인수.

네, 혼란 스러워요.

docker run을 실행할 때 그 중 하나를 무시할 수 있습니다.

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

CMDENTRYPOINT 차이점에 대한 추가 ENTRYPOINT :

/ bin / bash와 같은 docker run 인수는 Dockerfile에서 작성한 CMD 명령을 무시합니다.

ENTRYPOINT는 docker run [args] 와 같은 일반 명령으로 런타임에 재정의 될 수 없습니다. docker run [args] 의 끝에있는 args 는 ENTRYPOINT에 대한 인수로 제공됩니다. 이 방법으로 우리는 ls 와 같은 일반적인 바이너리와 같은 container 를 생성 할 수 있습니다.

따라서 CMD는 ENTRYPOINT에 대한 기본 매개 변수로 작동 할 수 있으며 [args]에서 CMD args를 무시할 수 있습니다.

ENTRYPOINT는 --entrypoint로 재정의 될 수 있습니다.




code 에서 EntryPoint 기능에 대한 의견

// 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 도커 빌드 -t ent_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

ps : EntryPoint가있는 상태에서 CMD는 EntryPoint에 제공 할 인수를 보유합니다. EntryPoint가 없으면 CMD가 실행될 명령이됩니다.







Docker 문서 에 따르면,

CMD 및 ENTRYPOINT 명령은 모두 컨테이너를 실행할 때 실행될 명령을 정의합니다. 그들의 협력을 묘사하는 규칙은 거의 없습니다.

  1. Dockerfile은 CMD 또는 ENTRYPOINT 명령 중 적어도 하나를 지정해야합니다.
  2. ENTRYPOINT 는 컨테이너를 실행 파일로 사용할 때 정의해야합니다.
  3. CMDENTRYPOINT 명령에 대한 기본 인수를 정의하거나 컨테이너에서 ad-hoc 명령을 실행하는 방법으로 사용해야합니다.
  4. 대체 인수로 컨테이너를 실행할 때 CMD 가 대체됩니다.

아래 표 는 서로 다른 ENTRYPOINT / 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 exec_cmd p1_cmd            ║
╟────────────────────────────╫───────────────────────────────────────────────────────────╢
║ CMD [“p1_cmd”, “p2_cmd”]   ║ /bin/sh -c exec_entry p1_entry p1_cmd p2_cmd              ║
╟────────────────────────────╫───────────────────────────────────────────────────────────╢
║ CMD exec_cmd p1_cmd        ║ /bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd ║
╚════════════════════════════╩═══════════════════════════════════════════════════════════╝

- 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  ║
╚════════════════════════════╩═════════════════════════════════════════════════╝



Related



Tags

docker docker