cmd和dockefile中入口点的区别
我是新来的docker工人,有一个简单的问题,docker文件。 我们可以在dock文件中写入入口点和CMD。 似乎在创build容器期间执行入口点。 CMD在启动容器时执行。 这是真的?
不完全是:
ENTRYPOINT
configuration将作为可执行文件运行的容器。
所以它总是执行(或者默认/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指定
CMD
或ENTRYPOINT
命令之一。- 当使用容器作为可执行文件时,应该定义
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"]
(一个命令,一个参数)
- 如果没有
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存储库的Java库?
- 启动一个Phoenix应用程序,出现错误(UndefinedFunctionError)
- docker:来自守护程序的错误响应:grpc:连接不可用
- Dockernized Nginx +(Rails + Unicorn)+ Redis + PostgreSQL:connect()失败(111:连接被拒绝)
- 无法使用Laradock获取MySQL容器
- 使用Single容器configuration向Dockerrun.aws.json添加portMappings
- docker与VNC或stream浪汉与VNCgraphicsaplications
- 用Ionic2和dockerfile生成apk的Gitlab CI
- 我如何在云或数据中心上使用Docker?