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

译文来源:


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

查看所有标签

猜你喜欢:

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

Vim实用技巧

Vim实用技巧

[英] Drew Neil / 杨源、车文隆 / 人民邮电出版社 / 2014-5-1 / 59.00元

vim是一款功能丰富而强大的文本编辑器,其代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中得到非常广泛的使用。vim能够大大提高程序员的工作效率。对于vim高手来说,vim能以与思考同步的速度编辑文本。同时,学习和熟练使用vim又有一定的难度。 《vim实用技巧》为那些想要提升自己的程序员编写,阅读本书是熟练地掌握高超的vim技巧的必由之路。全书共21章,包括121个技巧。每一章......一起来看看 《Vim实用技巧》 这本书的介绍吧!

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

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码