父子码头中的CMD是否被子码头图像中的CMD / ENTRYPOINT覆盖?

问题描述 投票:3回答:2

我试图在码头上弄脏手。我知道CMDENTRYPOINT用于指定docker image的start / runnable命令,CMD覆盖ENTRYPOINT。但我不知道,它是如何工作的,当父码头图像,也有CMDENTRYPOINT或两个?

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

我知道https://github.com/docker/compose/issues/3140已经讨论过这样的问题了。但是,讨论相当陈旧(在2 - 3年之前)并且它没有清楚地回答我的问题。

提前致谢。

docker containers docker-image
2个回答
4
投票

如果在子图像中定义ENTRYPOINT,它将使CMD中标识的this issue的值无效。目标是避免令人困惑的情况,即将入口点作为args传递给您不再想要运行的命令。

除了这种特定情况之外,ENTRYPOINTCMD的值是继承的,可以被子图像单独覆盖,甚至可以被同一个Dockerfile的后续步骤覆盖。在最后定义的值具有优先权的图像中,每个图像中只存在一个值。


2
投票

ENTRYPOINT不会覆盖CMD,它们只代表结果命令的一部分,并且存在使生活更轻松。每当启动容器时,进程1的命令被确定为ENTRYPOINT + CMD,因此通常ENTRYPOINT只是二进制文件的路径,CMD是该二进制文件的参数列表。 CMD也可以很容易地从命令行覆盖,所以,再一次,让生活变得更轻松并使容器的行为就像常规二进制文件一样 - 如果你有man容器,你可以将入口点设置为/usr/bin/man,将cmd设置为man。因此,如果你只是启动容器,docker将执行/usr/bin/man man,但是如果运行类似docker run man docker的东西,生成的容器命令将是/usr/bin/man docker - 入口点保持不变,cmd更改,并且生成容器的结果命令只是这些的简单合并。

除非重写,否则ENTRYPOINT和CMD都从父图层(图像)继承,因此如果从图像X继承并重新定义CMD,您仍将拥有完全相同的ENTRYPOINT 反之亦然 。但是,正如下面提到的@BMitch,更改子图像中的ENTRYPOINT将有效地重置CMD。

© www.soinside.com 2019 - 2024. All rights reserved.