内容简介:总结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
译文来源:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Computation and Programming Using Python
John V. Guttag / The MIT Press / 2013-7 / USD 25.00
This book introduces students with little or no prior programming experience to the art of computational problem solving using Python and various Python libraries, including PyLab. It provides student......一起来看看 《Introduction to Computation and Programming Using Python》 这本书的介绍吧!