总结Entrypoint vs Cmd 基础知识点

栏目: 编程工具 · 发布时间: 7年前

内容简介:总结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后面,只是有时...

来自 docker官档

总结Entrypoint vs Cmd 基础知识点

六a, 如果用”SHELL”形式的ENTRYPOINT, CMD将被忽略

六b, 如果用”exec”形式的ENTRYPOINT, CMD将以参数添加在后面

知识点七, ENTRYPOINT和CMD都可以被 docker run -- entrypoint参数 override。

例如

docker run --entrypoint [my_entrypoint] test

最后,总结一下使用原则:

  1. 如果你不想开发者修改镜像缺省的执行命令,例如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

译文来源:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机科学概论(第7版) (平装)

计算机科学概论(第7版) (平装)

J.Glenn Brookshear / 王保江 / 人民邮电出版社 / 2003-9 / 49.0

《计算机科学概论(第2版)》更新了部分内容,使其更加贴近于计算机科学领域内的最新趋势,这包括了网络安全、开源运动、关联存储、公钥加密、XML、Java和C#等内容。扩充了网络和Internet所覆盖的内容。一个程序用C#语言编写,还有C、C++和Java,作为语言的例子。不过整个方法依旧保持语言的独立。一起来看看 《计算机科学概论(第7版) (平装)》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换