cmd和dockefile中入口点的区别

我是新来的docker工人,有一个简单的问题,docker文件。 我们可以在dock文件中写入入口点和CMD。 似乎在创build容器期间执行入口点。 CMD在启动容器时执行。 这是真的?

不完全是:

ENTRYPOINTconfiguration将作为可执行文件运行的容器。
所以它总是执行(或者默认/bin/sh -c )。

 ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred) ENTRYPOINT command param1 param2 (shell form) 

ENTRYPOINT docker run <image>命令行参数将被添加到执行forms为ENTRYPOINT所有元素之后,并将覆盖使用CMD指定的所有元素。

shellforms防止使用任何CMD或运行命令行参数,但有一个缺点,即您的ENTRYPOINT将作为/bin/sh -c的子命令启动,该命令不传递信号。
这意味着可执行文件不会是容器的PID 1 – 并且不会接收到Unix信号 – 所以您的可执行文件将不会收到来自docker stop <container>的SIGTERM。

您可以查看CMD作为ENTRYPOINT参数。
如果没有入口点(默认命令是“ /bin/sh -c ”), CMD可以包含一个可执行文件。
如果ENTRYPOINT已经运行了一个可执行文件,那么CMD参数就是这个命令的参数(如果使用docker run没有附加的参数)。


ENTRYPOINT docker start ,正如问题1437所提到的那样, ENTRYPOINT被执行,但是只能使用来自CMD参数(所以使用了CMD ,但是不能用你自己的参数在命令行上覆盖它)。
如果你想使用CMD,你需要docker run ,而不是docker start

实际上有一个最近正在进行的PR ( PR 19746 ),它允许--cmd start命令使用可选的--cmd-c )标志来指定要使用的cmd,而不是cmd /入口点中的缺省命令。


官方Dockerfile文档现在有一个“ 了解CMD和进入点如何交互 ”部分:

  • Dockerfile应至less指定CMDENTRYPOINT命令之一。
  • 当使用容器作为可执行文件时,应该定义ENTRYPOINT
  • 应该使用CMD作为为ENTRYPOINT命令定义默认参数或在容器中执行ad-hoc命令的一种方法。
  • 当使用替代参数运行容器时, CMD将被覆盖。

这意味着,如果你的Dockerfile包含:

  • 没有CMD

    • 如果没有ENTRYPOINT :错误,不允许
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry
    • ENTRYPOINT ["exec_entry", "p1_entry"]表示exec_entry p1_entry
  • CMD ["exec_cmd", "p1_cmd"] (一个命令,一个参数)

    • 如果没有ENTRYPOINTexec_cmd p1_cmd
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry exec_cmd p1_cmd
    • ENTRYPOINT ["exec_entry", "p1_entry"]表示exec_entry p1_entry exec_cmd p1_cmd
  • CMD ["p1_cmd", "p2_cmd"]

    • 如果没有ENTRYPOINTp1_cmd p2_cmd
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry p1_cmd p2_cmd (好)
    • ENTRYPOINT [“exec_entry”, “p1_entry”]表示exec_entry p1_entry p1_cmd p2_cmd
  • CMD exec_cmd p1_cmd

    • 如果没有ENTRYPOINT/bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT [“exec_entry”, “p1_entry”]表示exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd