【问题标题】:difference between cmd and entrypoint in dockefiledockerfile中cmd和入口点的区别
【发布时间】:2016-05-28 22:11:24
【问题描述】:

我是 docker 新手,对 dockfile 有一个简单的问题。我们可以在停靠文件中写入入口点和 CMD。似乎在创建容器期间执行了入口点。并且 CMD 在启动容器期间执行。这是真的吗?

【问题讨论】:

标签: docker


【解决方案1】:

不完全是:

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

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

docker run <image> 的命令行参数将附加在 exec 表单 ENTRYPOINT 中的所有元素之后,并将覆盖使用 CMD 指定的所有元素。

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

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


使用docker start,如issue 1437 中所述,执行ENTRYPOINT,但仅使用来自CMD 的参数(因此使用CMD,但您不能在命令行)。
如果你想使用 CMD,你需要docker run,而不是docker start

实际上有一个正在进行的 PR (PR 19746),它允许 docker start 命令采用可选的--cmd (-c) 标志来指定要使用的 cmd,而不是来自 cmd/ 的默认值入口点。


Official Dockerfile documentation 现在有一个部分“Understand how CMD and ENTRYPOINT interact”:

  • Dockerfile 应至少指定CMDENTRYPOINT 命令之一。
  • 将容器用作可执行文件时应定义ENTRYPOINT
  • CMD 应该用作为 ENTRYPOINT 命令或在容器中执行临时命令定义默认参数的一种方式。
  • 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"](一个命令,一个参数)

    • 如果没有ENTRYPOINT:exec_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"]

    • 如果没有ENTRYPOINT: p1_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

【讨论】:

  • 如果 docker start 会怎样?
  • @richard 我已经编辑了答案以包含 docker start。
  • 非常感谢,我正在努力练习寻找差异。
  • 例如,看hub.docker.com/r/k3ck3c/nethogs,它在wlan0上启动nethogs(因为ENTRYPOINT是nethogs,CMD是wlan0,如果你用docker run -it k3ck3c/captvty启动它,如果你想监视器,说 eth0,你会这样做 docker run -it k3ck3c/captvty eth0 也许像这样的例子更能解释它
  • 谢谢!我需要打印这个
猜你喜欢
  • 2016-09-24
  • 2014-02-28
  • 2020-11-11
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多