父泊坞窗中的CMD是否被子泊坞窗映像中的CMD / ENTRYPOINT覆盖?

Man*_*hit 5 containers docker docker-image

我试图弄脏码头工人。我知道CMDENTRYPOINT用于指定docker image的start / runnable命令,CMD并被覆盖ENTRYPOINT。但是我不知道,当父泊坞窗映像也具有CMDOR ENTRYPOINT或BOTH 时,它是如何工作的?

子映像是否从父docker映像继承那些值?如果是这样,那么ENTRYPOINT父图像CMD中的图像是否会覆盖子图像中的图像?

我知道这样的问题已经在https://github.com/docker/compose/issues/3140讨论过。但是,讨论的时间已经很久了(2-3年之前),并且无法清晰回答我的问题。

提前致谢。

BMi*_*tch 8

如果ENTRYPOINT在子图像中定义,它将使此问题中CMD标识的值无效。目的是避免将入口点作为args传递给您不再希望运行的命令的混乱情况。

除了这种具体情况,价值ENTRYPOINTCMD继承,并可以通过一个孩子的图像或同一Dockerfile甚至后面的步骤可以单独覆盖。这些图像中的每一个只有一个值会存在于图像中,最后定义的值优先。

  • image#3 将具有您在 image#3 中定义的 CMD 和 ENTRYPOINT。如果您定义了两者,那么之前定义的值并不重要,每个字段只有一个值,没有内置链接。 (2认同)

Etk*_*tki 5

ENTRYPOINT 不会覆盖 CMD,它们只是代表结果命令的一部分并且存在以使生活更轻松。每当容器启动时,进程 1 的命令被确定为 ENTRYPOINT + CMD,因此通常 ENTRYPOINT 只是二进制文件的路径,而 CMD 是该二进制文件的参数列表。CMD 也可以很容易地从命令行覆盖。

所以,再一次,这只是让生活更轻松并使容器表现得像常规二进制文件一样的事情 - 如果您有man容器,您可以将入口点设置为/usr/bin/mancmd 为man。因此,如果您只是启动容器,docker 将执行/usr/bin/man man,但如果您运行类似的内容docker run man docker,则生成的容器命令将是/usr/bin/man docker- 入口点保持不变,cmd 更改,并且生成的启动容器命令只是这些命令的简单合并。

ENTRYPOINT 和 CMD 都是从父层(图像)继承的,除非被覆盖,所以如果你从图像 X 继承并重新定义 CMD,你仍然会拥有相同的 ENTRYPOINT 反之亦然. 但是,正如下面提到的@BMitch,更改子图像中的 ENTRYPOINT 将有效地重置 CMD。