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

译文来源:


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

查看所有标签

猜你喜欢:

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

Introduction to Computation and Programming Using Python

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》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具