内容简介:总结Entrypoint vs Cmd 基础知识点
Entrypoint和cmd作为dockerfile的镜像定义,功能十分相似,经常令人困惑。
以下是我根据一份英文博客,总结一下它们的一些区别与用法,着重在总结知识点,内容有所删减。
知识点一,你至少得定义一个(ENTRYPOINT 或者CMD),以保证运行。否则容器跑不起来。
知识点二, 你的容器运行时只定义它们其中一个的话,CMD和ENTRYPOINT的效果是一样的。
知识点三, 它们都有两个版本,一个是”SHELL", 另一个是”exec”版本。
例如:
“SHELL”版本中,shell (/bin/sh -c)为PID 1
$ docker exec 117 ps PID USER TIME COMMAND 1 root 0:00 /bin/sh -c ping www.google.com 7 root 0:00 ping www.google.com 8 root 0:00 ps
“exec”版本中, 用户定义的执行命令为PID 1
$ docker exec 139 ps PID USER TIME COMMAND 1 root 0:00 ping www.google.com 7 root 0:00 ps
知识点四,”exec”版本是所推荐的形式。
原因是容器的原始设计是只包含一个进程,发送给容器的指令(例如SIGINT)能够直接被pid1的用户命令收到,从而马上执行相应操作。
“SHELL”版本中, shell 是第一个收到容器指令的,它并不能把指令传给子进程。导致的与期望的行为不一致。
以下”SHELL”版本的例子, ctrl + c之后, 容器并没有退出。 SIGINT指令只传给了sh, 没有再传给子进程ping, 因此它并没有马上退出。
$ cat Dockerfile FROM alpine ENTRYPOINT ping www.google.com $ docker build -t test . $ docker run test PING www.google.com (172.217.7.164): 56 data bytes 64 bytes from 172.217.7.164: seq=0 ttl=37 time=0.124 ms ^C^C^C^C64 bytes from 172.217.7.164: seq=4 ttl=37 time=0.334 ms 64 bytes from 172.217.7.164: seq=5 ttl=37 time=0.400 ms
知识点五, 没有SHELL? 那就没有环境变量了。
如果不用 shell 版本,那么就不能获得环境变量带来的好处喽(例如$PATH)。
你得定义执行命令的全路径,例如这个 java 的全路径以保证命令可以正确执行。
FROM openjdk:8-jdk-alpine WORKDIR /data COPY *.jar /data CMD ["/usr/bin/java", "-jar", "spring.jar"]
知识点六,CMD有时添加到ENTRYPOINT后面,只是有时...
六a, 如果用”SHELL”形式的ENTRYPOINT, CMD将被忽略
六b, 如果用”exec”形式的ENTRYPOINT, CMD将以参数添加在后面
知识点七, ENTRYPOINT和CMD都可以被 docker run -- entrypoint参数 override。
例如
docker run --entrypoint [my_entrypoint] test
最后,总结一下使用原则:
-
如果你不想开发者修改镜像缺省的执行命令,例如ping, 那么用ENTRYPOINT。
以命令(ENTRYPOINT)+ 参数(CMD)的形式,提供用户修改参数的灵活性。
这个例子中,docker run 可以灵活的修改url, 而不需要指定ping命令。
{{{
$ cat Dockerfile
FROM alpine
ENTRYPOINT ["ping"]
CMD [" www.google.com" ]
$ docker run test www.yahoo.com
PING www.yahoo.com (98.139.183.24): 56 data bytes
64 bytes from 98.139.183.24: seq=0 ttl=37 time=0.590 ms
}}}
2. 如果甚至希望提供修改镜像缺省命令的能力,那么只用CMD(没有ENTRYPOINT)
这样用户可以完全地自己定义我起镜像用什么命令,灵活性最高。
$ cat Dockerfile FROM alpine CMD ["ping", "www.google.com"] $ docker run -it test sh / # ps PID USER TIME COMMAND 1 root 0:00 sh 7 root 0:00 ps
译文来源:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出Tapestry
董黎伟 / 电子工业出版社 / 2007-3 / 49.0
本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在J2EE Web应用程序中应用Tapestry框架的先进经验。 本书详细介绍了Hivemind框架的原理与应用,使读者不但可以通过Hivemind来重构Tapestry的官方实现,还可以使用Hive......一起来看看 《深入浅出Tapestry》 这本书的介绍吧!