【发布时间】:2016-05-28 22:11:24
【问题描述】:
我是 docker 新手,对 dockfile 有一个简单的问题。我们可以在停靠文件中写入入口点和 CMD。似乎在创建容器期间执行了入口点。并且 CMD 在启动容器期间执行。这是真的吗?
【问题讨论】:
标签: docker
我是 docker 新手,对 dockfile 有一个简单的问题。我们可以在停靠文件中写入入口点和 CMD。似乎在创建容器期间执行了入口点。并且 CMD 在启动容器期间执行。这是真的吗?
【问题讨论】:
标签: docker
不完全是:
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 应至少指定
CMD或ENTRYPOINT命令之一。- 将容器用作可执行文件时应定义
ENTRYPOINT。CMD应该用作为ENTRYPOINT命令或在容器中执行临时命令定义默认参数的一种方式。CMD将在使用替代参数运行容器时被覆盖。
这意味着,如果您的 Dockerfile 包含:
没有
CMD:
- 如果否
ENTRYPOINT:错误,不允许ENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entryENTRYPOINT ["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_cmdENTRYPOINT ["exec_entry", "p1_entry"]表示exec_entry p1_entry exec_cmd p1_cmd
CMD ["p1_cmd", "p2_cmd"]
- 如果没有
ENTRYPOINT:p1_cmd p2_cmdENTRYPOINT 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_cmdENTRYPOINT exec_entry p1_entry表示/bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmdENTRYPOINT [“exec_entry”, “p1_entry”]表示exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
【讨论】:
nethogs,CMD是wlan0,如果你用docker run -it k3ck3c/captvty启动它,如果你想监视器,说 eth0,你会这样做 docker run -it k3ck3c/captvty eth0 也许像这样的例子更能解释它