我试图在码头上弄脏手。我知道CMD
或ENTRYPOINT
用于指定docker image的start / runnable命令,CMD
覆盖ENTRYPOINT
。但我不知道,它是如何工作的,当父码头图像,也有CMD
或ENTRYPOINT
或两个?
子图像是否从父级docker图像继承这些值?如果是这样,那么父图像中的ENTRYPOINT
会覆盖子图像中的CMD
吗?
我知道https://github.com/docker/compose/issues/3140已经讨论过这样的问题了。但是,讨论相当陈旧(在2 - 3年之前)并且它没有清楚地回答我的问题。
提前致谢。
如果在子图像中定义ENTRYPOINT
,它将使CMD
中标识的this issue的值无效。目标是避免令人困惑的情况,即将入口点作为args传递给您不再想要运行的命令。
除了这种特定情况之外,ENTRYPOINT
和CMD
的值是继承的,可以被子图像单独覆盖,甚至可以被同一个Dockerfile的后续步骤覆盖。在最后定义的值具有优先权的图像中,每个图像中只存在一个值。
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。