总结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

译文来源:


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

查看所有标签

猜你喜欢:

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

深入浅出Tapestry

深入浅出Tapestry

董黎伟 / 电子工业出版社 / 2007-3 / 49.0

本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在J2EE Web应用程序中应用Tapestry框架的先进经验。 本书详细介绍了Hivemind框架的原理与应用,使读者不但可以通过Hivemind来重构Tapestry的官方实现,还可以使用Hive......一起来看看 《深入浅出Tapestry》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具